Aller au contenu
Documentation
Français
Ouvrir l'application

Référence de l'API

Référence complète de l'API NovaFisko v1, générée depuis la spécification OpenAPI, avec paramètres, schémas et exemples pour chaque route.

Cette référence est générée à partir de la spécification OpenAPI 3.1 de NovaFisko. Elle décrit chaque route avec ses paramètres, le corps attendu, les réponses possibles et un exemple d'appel en curl, PHP, JavaScript et Python.

Toutes les routes sont relatives à https://api.novafisko.com/v1 et exigent, sauf mention contraire, l'en-tête Authorization: Bearer <jeton>. Les routes sont regroupées par domaine. Les schémas se déplient d'un clic et chaque exemple se copie avec le bouton Copier.

Astuce

Vous préférez travailler dans votre propre outil ? Téléchargez la spécification en JSON ou en YAML, ou importez la collection Postman.

Si vous découvrez l'API, commencez par la vue d'ensemble, l'authentification et les conventions. Les cas d'usage montrent comment enchaîner les appels.

Référence complète de l'API NovaFisko v1.0.0 : 240 points d'accès regroupés par domaine, générés depuis la spécification OpenAPI 3.1. Dépliez un point d'accès pour voir ses paramètres, son corps, ses réponses et un exemple d'appel.

Les résumés et descriptions des points d'accès sont en anglais : ils proviennent directement de la spécification.

URL de basehttps://api.novafisko.com
240 points d'accès
Entêtes et paramètres communs Idempotence, verrou optimiste, appareil, langue et URL signées : décrits une fois ici.
NomTypeDescription
Accept-Language
header
stringLanguage of the translated messages and labels (fr, nl, en, de). The language of the authenticated user wins when it is set; several endpoints also accept ?lang=.
fr nl en de
X-Client-Mutation-Id
header
stringIdempotence key chosen by the client (64 characters max, a UUID is recommended). A request replayed with the same key returns the memorised result with status 200 and X-Idempotent-Replay: 1; nothing is executed twice.
ex. b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11
X-Base-Version
header
integerOptimistic lock (opt-in): the version of the record the client last read. When the record moved on the server the answer is 409 conflict with server_version and server_data, and nothing is changed.
ex. 3
X-Operation-Id
header
string <uuid>UUID grouping every change of the request in the history (generated when absent). Returned in the response when something was recorded: it is the handle of « undo ».
X-Device-Id
header
stringStable id of the app install or of the integration (64 characters max). Shown in the history and in the synchronisation status.
ex. erp-connector-01
X-Device-Name
header
stringReadable device name, percent-encoded (120 characters max).
ex. ERP%20connector
X-Occurred-At
header
string <date-time>ISO 8601 date of the action on the client. Bounded to ±24 h around the server time; used to rank conflicts.
X-Origin
header
stringoffline_sync when the request replays an action made offline.
offline_sync
signature
query
stringSignature of the URL (issued by the API).
expires
query
integerUnix timestamp after which the signed URL is refused.

Entêtes de réponse

Entête de réponseDescription
X-Operation-IdOperation id under which the changes of the request were recorded in the history. Present only when something was recorded.
X-Trashed1 when the DELETE moved the record to the recycle bin (restorable) instead of destroying it.
X-Idempotent-Replay1 when the answer is the memorised result of a previous request carrying the same X-Client-Mutation-Id.
X-Export-FingerprintSHA-256 of the exported data set: two exports of the same data carry the same fingerprint.
Content-DispositionFile name of the download (attachment; filename="…") or inline for previews.
X-RateLimit-LimitMaximum number of requests in the current window.
X-RateLimit-RemainingRequests left in the current window.
Retry-AfterSeconds to wait before the next attempt.

Meta

Service status, connectivity probe and country packs.

GET/API root Public

Name and version of the API.

Public endpoint: no bearer token.

Identifiant d'opération root

Réponses

200OK

application/json

Schéma object
  • namestring
    ex. NovaFisko API
  • versionstring
    ex. v1
  • statusstring
    ex. ok
Exemple
{
    "name": "NovaFisko API",
    "version": "v1",
    "status": "ok"
}

Exemple d'appel

curl -X GET "https://api.novafisko.com/" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/statusService status Public

Public endpoint: no bearer token.

Identifiant d'opération status

Réponses

200OK

application/json

Schéma object
  • okboolean
  • timestring <date-time>
Exemple
{
    "ok": true,
    "time": "2026-03-15T09:41:00+00:00"
}

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/status" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/status', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/status", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/status",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/pingConnectivity probe Public

Cheap probe without database access. The apps call it to leave offline mode; integrations can use it as a health check and to read the server clock.

Public endpoint: no bearer token.

Identifiant d'opération ping

Réponses

200OK

application/json

Schéma object
  • okboolean
  • server_timestring <date-time>
Exemple
{
    "ok": true,
    "server_time": "2026-03-15T09:41:00+00:00"
}

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/ping" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/ping', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/ping", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/ping",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/country-packsAvailable country packs read

Country packs (chart of accounts, VAT codes, journals) a company file can be created with.

Integration tokens need the read ability.

Identifiant d'opération country-packs

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object[]

Tableau de

  • codestring
    BE FR LU
  • currencystring
    ex. EUR
  • vat_regimesstring[]
    monthly quarterly franchise exempt unit
Exemple
[
    {
        "code": "BE",
        "currency": "EUR",
        "vat_regimes": [
            "monthly"
        ]
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/country-packs" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/country-packs', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/country-packs", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/country-packs",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Auth

Sign-in, account of the user, demo session.

POST/v1/auth/loginSign in Public 20 / 1 min

Exchanges an e-mail and a password for a session token (all abilities). Novadesko fiduciary users sign in with their Novadesko credentials: firm, team and company files are mirrored at each sign-in. Ten failed attempts per IP lock the sign-in for five minutes.

Public endpoint: no bearer token.

Rate limit: 20 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.login

Corps de la requête

application/json

Schéma object
  • emailstring <email>requis
  • passwordstringrequis
    ex. ••••••••
  • device_namestring
    Label of the token (100 characters max).
    ex. MacBook de Claire
Exemple
{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "correct horse battery staple",
    "device_name": "ERP connector"
}

Réponses

201Signed in

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • tokenstring
    Bearer token, shown once.
  • userUser
Exemple
{
    "token": "57|Qm9x2kL8vT4nR7sW1pZ5cY3hJ6dF0gA9bE2uI4oK",
    "user": {
        "id": 12,
        "name": "Claire Dumont",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "locale": "fr",
        "email_verified": true,
        "pending_email": null,
        "is_platform_admin": false,
        "is_demo": false,
        "firms": [
            {
                "public_token": "NDTQVQU4AUAV",
                "name": "Fiduciaire Dumont & Associés",
                "role": "admin"
            }
        ],
        "managed_firms": [
            {
                "public_token": "NDTQVQU4AUAV",
                "name": "Fiduciaire Dumont & Associés"
            }
        ]
    }
}
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/login" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "correct horse battery staple",
    "device_name": "ERP connector"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/login', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'json' => [
        'email' => 'claire.dumont@fiduciaire-dumont.be',
        'password' => 'correct horse battery staple',
        'device_name' => 'ERP connector',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/login", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "email": "claire.dumont@fiduciaire-dumont.be",
      "password": "correct horse battery staple",
      "device_name": "ERP connector"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/login",
    headers={
        "Accept": "application/json",
    },
    json={
        "email": "claire.dumont@fiduciaire-dumont.be",
        "password": "correct horse battery staple",
        "device_name": "ERP connector"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/demoSign in to the demo Public 10 / 1 min

Creates an ephemeral user attached to the demo firm (« Fiduciaire Démo », four realistic Belgian company files) and returns its token. Local bookkeeping is allowed (entries, lettering, VAT declarations, exports, history, recycle bin, synchronisation); every external effect answers 403 demo_mode: Peppol, Novadesko, e-mails and reminders, integrations, licence keys, team and firm management, company creation and deletion, webhooks and integration tokens, company lookups and VIES, uploads and analysis of the document importer, SEPA files (operations flagged x-demo-blocked). A demo user never reaches anything outside the demo firm (404). The demo data is reset every night and demo users are purged after 24 hours.

Public endpoint: no bearer token.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • demo_unavailable: the demo data set is not available right now

Identifiant d'opération auth.demo

Corps de la requête facultatif

application/json

Schéma object
  • localestring
    fr nl en de
  • device_namestring
    100 characters max.
Exemple
{
    "locale": "fr"
}

Réponses

201Demo session opened

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • tokenstring
  • userUser
  • demoobject
    Propriétés
    • firmobject
      Propriétés
      • public_tokenstring
      • namestring
        ex. Fiduciaire Démo
    • companiesobject[]
      Propriétés
      • public_tokenstring
      • codestring
        ex. COMPTOIR
      • namestring
        ex. Le Comptoir Montois SRL
    • expires_atstring <date-time>
      End of life of the demo user.
    • resets_atstring <date-time>
      Next nightly reset of the demo data.
Exemple
{
    "token": "XBVD5O1L29HC",
    "user": {
        "id": 12,
        "name": "Claire Dumont",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "locale": "fr",
        "email_verified": true,
        "pending_email": "claire.dumont@fiduciaire-dumont.be",
        "is_platform_admin": false,
        "is_demo": false,
        "firms": [
            {
                "public_token": "NDTQVQU4AUAV",
                "name": "Fiduciaire Dumont & Associés",
                "role": "admin"
            }
        ],
        "managed_firms": [
            {
                "public_token": "NDTQVQU4AUAV",
                "name": "Fiduciaire Dumont & Associés"
            }
        ]
    },
    "demo": {
        "firm": {
            "public_token": "XBVD5O1L29HC",
            "name": "Fiduciaire Démo"
        },
        "companies": [
            {
                "public_token": "XBVD5O1L29HC",
                "code": "COMPTOIR",
                "name": "Le Comptoir Montois SRL"
            }
        ],
        "expires_at": "2026-03-15T09:41:00+00:00",
        "resets_at": "2026-03-15T09:41:00+00:00"
    }
}
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error
503The demo firm is not seeded (demo_unavailable).

application/json

Schéma Error

Exemple
{
    "message": "La démonstration est momentanément indisponible.",
    "code": "demo_unavailable"
}

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/demo" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "locale": "fr"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/demo', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'json' => [
        'locale' => 'fr',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/demo", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "locale": "fr"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/demo",
    headers={
        "Accept": "application/json",
    },
    json={
        "locale": "fr"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/auth/meCurrent user read

User behind the token, with the firms it belongs to and is_demo.

Integration tokens need the read ability.

Identifiant d'opération auth.me

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma User

Exemple
{
    "id": 12,
    "name": "Claire Dumont",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "locale": "fr",
    "email_verified": true,
    "pending_email": null,
    "is_platform_admin": false,
    "is_demo": false,
    "firms": [
        {
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés",
            "role": "admin"
        }
    ],
    "managed_firms": [
        {
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/auth/me" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/auth/me', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/me", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/auth/me",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/logoutSign out write

Revokes the token used for the request.

Integration tokens need the write ability.

Identifiant d'opération auth.logout

Entêtes communs : Accept-Language

Réponses

204Token revoked.

Pas de corps.

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/logout" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/logout', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/logout", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/logout",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/forgot-passwordAsk for a password reset Public 5 / 1 min

Always answers the same generic message, whether the account exists or not.

Public endpoint: no bearer token.

Rate limit: 5 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.forgot-password

Corps de la requête

application/json

Schéma object
  • emailstring <email>requis
  • localestring
    fr nl en de
Exemple
{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "locale": "fr"
}

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma Message

Exemple
{
    "message": "Mot de passe modifié."
}
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/forgot-password" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "locale": "fr"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/forgot-password', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'json' => [
        'email' => 'claire.dumont@fiduciaire-dumont.be',
        'locale' => 'fr',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/forgot-password", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "email": "claire.dumont@fiduciaire-dumont.be",
      "locale": "fr"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/forgot-password",
    headers={
        "Accept": "application/json",
    },
    json={
        "email": "claire.dumont@fiduciaire-dumont.be",
        "locale": "fr"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/reset-passwordReset the password Public 10 / 1 min

With the token of the reset mail. Every device is signed out.

Public endpoint: no bearer token.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.reset-password

Corps de la requête

application/json

Schéma object
  • tokenstringrequis
  • emailstring <email>requis
  • passwordstringrequis
    8 characters at least.
  • password_confirmationstringrequis
Exemple
{
    "token": "XBVD5O1L29HC",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "string",
    "password_confirmation": "string"
}

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma Message

Exemple
{
    "message": "Mot de passe modifié."
}
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/reset-password" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "XBVD5O1L29HC",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "string",
    "password_confirmation": "string"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/reset-password', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'json' => [
        'token' => 'XBVD5O1L29HC',
        'email' => 'claire.dumont@fiduciaire-dumont.be',
        'password' => 'string',
        'password_confirmation' => 'string',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/reset-password", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "token": "XBVD5O1L29HC",
      "email": "claire.dumont@fiduciaire-dumont.be",
      "password": "string",
      "password_confirmation": "string"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/reset-password",
    headers={
        "Accept": "application/json",
    },
    json={
        "token": "XBVD5O1L29HC",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "password": "string",
        "password_confirmation": "string"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/auth/email/verify/{id}/{hash}Confirm an e-mail address URL signée 30 / 1 min

Signed link of the verification mail. Opened in a browser it redirects to the app; with format=json it answers JSON.

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.email.verify

Paramètres de chemin

NomTypeDescription
id requisintegerId of the record.
ex. 42
hash requisstringSHA-1 of the e-mail address being confirmed.
ex. 5f2b8c…

Paramètres de requête

NomTypeDescription
formatstringAnswer JSON instead of redirecting.
json

Entêtes communs : signature expires

Réponses

200Confirmed (format=json).

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • verifiedboolean
Exemple
{
    "verified": true
}
302Redirection to app.novafisko.com/email-verified.
Entête de réponseDescription
LocationTarget of the redirection.
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Invalid or outdated link (format=json).

application/json

Schéma object
  • verifiedboolean
    ex. false
Exemple
{
    "verified": false
}
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/auth/email/verify/42/5f2b8c%E2%80%A6" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/auth/email/verify/42/5f2b8c%E2%80%A6', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/email/verify/42/5f2b8c%E2%80%A6", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/auth/email/verify/42/5f2b8c%E2%80%A6",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/change-passwordChange the password Jeton de session Hors démo 10 / 1 min

Refused for accounts whose password is managed by Novadesko.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.change-password

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • current_passwordstringrequis
  • passwordstringrequis
    8 characters at least, different from the current one.
  • password_confirmationstringrequis
Exemple
{
    "current_password": "string",
    "password": "string",
    "password_confirmation": "string"
}

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma Message

Exemple
{
    "message": "Mot de passe modifié."
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/change-password" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "current_password": "string",
    "password": "string",
    "password_confirmation": "string"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/change-password', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'current_password' => 'string',
        'password' => 'string',
        'password_confirmation' => 'string',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/change-password", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "current_password": "string",
      "password": "string",
      "password_confirmation": "string"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/change-password",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "current_password": "string",
        "password": "string",
        "password_confirmation": "string"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/change-emailChange the e-mail address Jeton de session Hors démo 6 / 1 min

The current password is asked again; the new address replaces the old one once confirmed.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 6 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.change-email

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • emailstring <email>requis
  • passwordstringrequis
Exemple
{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "string"
}

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • messagestring
  • pending_emailstring <email>
Exemple
{
    "message": "OK",
    "pending_email": "claire.dumont@fiduciaire-dumont.be"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/change-email" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "claire.dumont@fiduciaire-dumont.be",
    "password": "string"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/change-email', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'email' => 'claire.dumont@fiduciaire-dumont.be',
        'password' => 'string',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/change-email", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "email": "claire.dumont@fiduciaire-dumont.be",
      "password": "string"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/change-email",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "email": "claire.dumont@fiduciaire-dumont.be",
        "password": "string"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/email/resendSend the confirmation mail again Jeton de session Hors démo 6 / 1 min

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 6 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération auth.email.resend

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • sentboolean
  • messagestring
Exemple
{
    "sent": true,
    "message": "OK"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/email/resend" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/email/resend', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/email/resend", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/email/resend",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/auth/notification-preferencesMail notification preferences read

Integration tokens need the read ability.

Identifiant d'opération auth.notification-preferences

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • categoriesobject[]
    Propriétés
    • keystring
      account firm billing documents integrations platform
    • labelstring
      ex. Documents
    • descriptionstring
    • lockedboolean
      Locked categories (account security) cannot be switched off.
    • enabledboolean
Exemple
{
    "categories": [
        {
            "key": "account",
            "label": "Documents",
            "description": "Description",
            "locked": true,
            "enabled": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/auth/notification-preferences" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/auth/notification-preferences', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/notification-preferences", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/auth/notification-preferences",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/auth/notification-preferencesUpdate the notification preferences Jeton de session

Locked categories and unknown keys are ignored.

Session token only: integration tokens are refused with 403 session_token_required.

Identifiant d'opération auth.notification-preferences.update

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • prefsobjectrequis
    Category => enabled.
Exemple
{
    "prefs": {
        "documents": true,
        "billing": false
    }
}

Réponses

200OK

application/json

Schéma object
  • categoriesobject[]
    Propriétés
    • keystring
      account firm billing documents integrations platform
    • labelstring
      ex. Documents
    • descriptionstring
    • lockedboolean
      Locked categories (account security) cannot be switched off.
    • enabledboolean
Exemple
{
    "categories": [
        {
            "key": "account",
            "label": "Documents",
            "description": "Description",
            "locked": true,
            "enabled": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/auth/notification-preferences" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "prefs": {
        "documents": true,
        "billing": false
    }
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/auth/notification-preferences', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'prefs' => [
            'documents' => true,
            'billing' => false,
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/notification-preferences", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "prefs": {
          "documents": true,
          "billing": false
      }
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/auth/notification-preferences",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "prefs": {
            "documents": True,
            "billing": False
        }
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Integration tokens

Long-lived tokens for server-to-server integrations, limited to the abilities read, write and sync.

GET/v1/auth/tokensList the integration tokens Jeton de session

Integration tokens of the current user. The secret is never returned again.

Session token only: integration tokens are refused with 403 session_token_required.

Identifiant d'opération auth.tokens.index

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
Exemple
{
    "data": [
        {
            "id": 57,
            "name": "ERP connector",
            "abilities": [
                "read"
            ],
            "created_at": "2026-03-15T09:41:00+00:00",
            "expires_at": "2026-03-15T09:41:00+00:00",
            "last_used_at": "2026-03-15T09:41:00+00:00"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/auth/tokens" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/auth/tokens', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/tokens", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/auth/tokens",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/auth/tokensCreate an integration token Jeton de session Hors démo 20 / 1 min

Long-lived token for a server-to-server integration, limited to the chosen abilities:

  • read: every GET;
  • write: POST, PUT, PATCH and DELETE;
  • sync: the offline synchronisation endpoints (sync/bootstrap, sync/pull, sync/push, sync/status, sync/conflicts).

The token acts with the rights of the user who created it (same firms, same company files). The plain token is shown once: store it in a secret manager.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 20 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • token_limit_reached: 50 integration tokens per user at most

Identifiant d'opération auth.tokens.store

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • namestringrequis
    Label (100 characters max).
  • abilitiesstring[]requis
    read write sync
  • expires_in_daysinteger | null
    1 to 730; null or absent = no expiry.
  • expires_atstring <date-time> | null
    Alternative to expires_in_days: a future date, 730 days ahead at most.
Exemple
{
    "name": "ERP connector",
    "abilities": [
        "read",
        "sync"
    ],
    "expires_in_days": 365
}

Réponses

201Token created (data and integration_token are the same object)

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "token": "57|Qm9x2kL8vT4nR7sW1pZ5cY3hJ6dF0gA9bE2uI4oK",
    "data": {
        "id": 57,
        "name": "ERP connector",
        "abilities": [
            "read",
            "sync"
        ],
        "created_at": "2026-10-05T09:12:44+00:00",
        "expires_at": "2027-10-05T09:12:44+00:00",
        "last_used_at": null
    },
    "integration_token": {
        "id": 57,
        "name": "ERP connector",
        "abilities": [
            "read",
            "sync"
        ],
        "created_at": "2026-10-05T09:12:44+00:00",
        "expires_at": "2027-10-05T09:12:44+00:00",
        "last_used_at": null
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/auth/tokens" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ERP connector",
    "abilities": [
        "read",
        "sync"
    ],
    "expires_in_days": 365
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/auth/tokens', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'name' => 'ERP connector',
        'abilities' => [
            'read',
            'sync',
        ],
        'expires_in_days' => 365,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/tokens", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "name": "ERP connector",
      "abilities": [
          "read",
          "sync"
      ],
      "expires_in_days": 365
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/auth/tokens",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "name": "ERP connector",
        "abilities": [
            "read",
            "sync"
        ],
        "expires_in_days": 365
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/auth/tokens/{token}Revoke an integration token Jeton de session Hors démo

Only the integration tokens of the current user; anything else answers 404.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération auth.tokens.destroy

Paramètres de chemin

NomTypeDescription
token requisintegerId of the integration token.
ex. 57

Entêtes communs : Accept-Language

Réponses

204Token revoked.

Pas de corps.

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/auth/tokens/57" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/auth/tokens/57', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/auth/tokens/57", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/auth/tokens/57",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Firms

Accounting firm: identity, team, assignment of the company files, activity.

GET/v1/firms/{firm}Firm, team and company files read

Any active member of the firm can read it.

Integration tokens need the read ability.

Identifiant d'opération firms.show

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Firm

Exemple
{
    "public_token": "NDTQVQU4AUAV",
    "name": "Fiduciaire Dumont & Associés",
    "enterprise_number": "0458662817",
    "vat_number": "BE0458662817",
    "itaa_number": "50.123.456",
    "itaa_status": "string",
    "itaa_quality": "string",
    "address": "Rue de Nimy 52",
    "postal_code": "7000",
    "city": "Mons",
    "website": "https://www.comptoir-montois.be",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "is_partner": true,
    "country_code": "BE",
    "locale": "fr",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "source": "local",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "can_manage": true,
    "members": [
        {
            "id": 12,
            "name": "Thomas Peeters",
            "email": "thomas.peeters@fiduciaire-dumont.be",
            "auth_source": "local",
            "locale": "fr",
            "role": "admin",
            "is_active": true,
            "all_companies": true,
            "companies": [
                {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL",
                    "code": "COMPTOIR",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ],
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "members": [
                {
                    "id": 42,
                    "name": "Thomas Peeters",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/firms/{firm}Update the identity of the firm write Hors démo

Admins and managers of the firm.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.update

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • namestring
    200 characters max.
  • enterprise_numberstring | null
  • vat_numberstring | null
  • itaa_numberstring | null
  • emailstring <email> | null
  • phonestring | null
  • websitestring | null
  • addressstring | null
  • postal_codestring | null
  • citystring | null
  • country_codestring
    ISO 3166-1 alpha-2.
  • localestring
    fr nl en de
Exemple
{
    "phone": "+32 65 31 42 18",
    "website": "https://www.fiduciaire-dumont.be"
}

Réponses

200OK

application/json

Schéma Firm

Exemple
{
    "public_token": "NDTQVQU4AUAV",
    "name": "Fiduciaire Dumont & Associés",
    "enterprise_number": "0458662817",
    "vat_number": "BE0458662817",
    "itaa_number": "50.123.456",
    "itaa_status": "string",
    "itaa_quality": "string",
    "address": "Rue de Nimy 52",
    "postal_code": "7000",
    "city": "Mons",
    "website": "https://www.comptoir-montois.be",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "is_partner": true,
    "country_code": "BE",
    "locale": "fr",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "source": "local",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "can_manage": true,
    "members": [
        {
            "id": 12,
            "name": "Thomas Peeters",
            "email": "thomas.peeters@fiduciaire-dumont.be",
            "auth_source": "local",
            "locale": "fr",
            "role": "admin",
            "is_active": true,
            "all_companies": true,
            "companies": [
                {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL",
                    "code": "COMPTOIR",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ],
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "members": [
                {
                    "id": 42,
                    "name": "Thomas Peeters",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+32 65 31 42 18",
    "website": "https://www.fiduciaire-dumont.be"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'phone' => '+32 65 31 42 18',
        'website' => 'https://www.fiduciaire-dumont.be',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "phone": "+32 65 31 42 18",
      "website": "https://www.fiduciaire-dumont.be"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "phone": "+32 65 31 42 18",
        "website": "https://www.fiduciaire-dumont.be"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/firms/{firm}/syncResynchronise the firm from Novadesko write Hors démo 6 / 1 min

Identity, members and company files of a firm linked to Novadesko. 422 when the firm is not linked, 503 when Novadesko does not answer.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 6 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération firms.sync

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma Firm

Exemple
{
    "public_token": "NDTQVQU4AUAV",
    "name": "Fiduciaire Dumont & Associés",
    "enterprise_number": "0458662817",
    "vat_number": "BE0458662817",
    "itaa_number": "50.123.456",
    "itaa_status": "string",
    "itaa_quality": "string",
    "address": "Rue de Nimy 52",
    "postal_code": "7000",
    "city": "Mons",
    "website": "https://www.comptoir-montois.be",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "is_partner": true,
    "country_code": "BE",
    "locale": "fr",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "source": "local",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "can_manage": true,
    "members": [
        {
            "id": 12,
            "name": "Thomas Peeters",
            "email": "thomas.peeters@fiduciaire-dumont.be",
            "auth_source": "local",
            "locale": "fr",
            "role": "admin",
            "is_active": true,
            "all_companies": true,
            "companies": [
                {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL",
                    "code": "COMPTOIR",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ],
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "members": [
                {
                    "id": 42,
                    "name": "Thomas Peeters",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/sync" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/sync', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/sync", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/sync",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/firms/{firm}/membersAdd a member write Hors démo

Attaches an existing user (by e-mail) or creates the account (password required then). 201 when the account was created, 200 when an existing user was attached.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • user_limit_reached: the licence does not allow one more user

Identifiant d'opération firms.members.store

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • emailstring <email>requis
  • namestring
    Required for a new account.
  • passwordstring | null
    8 characters at least; required for a new account.
  • rolestringrequis
    admin manager encoder reviewer
  • localestring
    fr nl en de
  • company_tokensstring[]
Exemple
{
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "name": "Thomas Peeters",
    "password": "S3cure-Pass!",
    "role": "encoder",
    "company_tokens": [
        "XBVD5O1L29HC"
    ]
}

Réponses

200Existing user attached

application/json

Schéma FirmMember

Exemple
{
    "id": 12,
    "name": "Thomas Peeters",
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "auth_source": "local",
    "locale": "fr",
    "role": "admin",
    "is_active": true,
    "all_companies": true,
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "role": "manager",
            "is_active": true
        }
    ]
}
201Account created and attached

application/json

Schéma FirmMember

Exemple
{
    "id": 12,
    "name": "Thomas Peeters",
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "auth_source": "local",
    "locale": "fr",
    "role": "admin",
    "is_active": true,
    "all_companies": true,
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "role": "manager",
            "is_active": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "name": "Thomas Peeters",
    "password": "S3cure-Pass!",
    "role": "encoder",
    "company_tokens": [
        "XBVD5O1L29HC"
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'email' => 'thomas.peeters@fiduciaire-dumont.be',
        'name' => 'Thomas Peeters',
        'password' => 'S3cure-Pass!',
        'role' => 'encoder',
        'company_tokens' => [
            'XBVD5O1L29HC',
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "email": "thomas.peeters@fiduciaire-dumont.be",
      "name": "Thomas Peeters",
      "password": "S3cure-Pass!",
      "role": "encoder",
      "company_tokens": [
          "XBVD5O1L29HC"
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "email": "thomas.peeters@fiduciaire-dumont.be",
        "name": "Thomas Peeters",
        "password": "S3cure-Pass!",
        "role": "encoder",
        "company_tokens": [
            "XBVD5O1L29HC"
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/firms/{firm}/members/{user}Update a member write Hors démo

Role, activation, name, password. The last active admin cannot lose its role.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.members.update

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
user requisintegerId of the user (member of the firm).
ex. 12

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • rolestring
    admin manager encoder reviewer
  • is_activeboolean
  • namestring
  • passwordstring | null
Exemple
{
    "role": "manager"
}

Réponses

200OK

application/json

Schéma FirmMember

Exemple
{
    "id": 12,
    "name": "Thomas Peeters",
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "auth_source": "local",
    "locale": "fr",
    "role": "admin",
    "is_active": true,
    "all_companies": true,
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "role": "manager",
            "is_active": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "role": "manager"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'role' => 'manager',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "role": "manager"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "role": "manager"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/firms/{firm}/members/{user}Remove a member write Hors démo

Detaches the user from the firm and from its company files. The user account itself is kept.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.members.destroy

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
user requisintegerId of the user (member of the firm).
ex. 12

Entêtes communs : Accept-Language

Réponses

204Done, no body.

Pas de corps.

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PUT/v1/firms/{firm}/members/{user}/companiesReplace the company files of a member write Hors démo

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.members.companies

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
user requisintegerId of the user (member of the firm).
ex. 12

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • company_tokensstring[]requis
  • rolestring
    manager encoder reviewer
Exemple
{
    "company_tokens": [
        "XBVD5O1L29HC",
        "K7MPL2QX9ZTA"
    ],
    "role": "encoder"
}

Réponses

200OK

application/json

Schéma FirmMember

Exemple
{
    "id": 12,
    "name": "Thomas Peeters",
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "auth_source": "local",
    "locale": "fr",
    "role": "admin",
    "is_active": true,
    "all_companies": true,
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "role": "manager",
            "is_active": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PUT "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12/companies" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "company_tokens": [
        "XBVD5O1L29HC",
        "K7MPL2QX9ZTA"
    ],
    "role": "encoder"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12/companies', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'company_tokens' => [
            'XBVD5O1L29HC',
            'K7MPL2QX9ZTA',
        ],
        'role' => 'encoder',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12/companies", {
  method: "PUT",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "company_tokens": [
          "XBVD5O1L29HC",
          "K7MPL2QX9ZTA"
      ],
      "role": "encoder"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.put(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/members/12/companies",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "company_tokens": [
            "XBVD5O1L29HC",
            "K7MPL2QX9ZTA"
        ],
        "role": "encoder"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PUT/v1/firms/{firm}/companies/{company}/membersReplace the members of a company file write Hors démo

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.companies.members

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • membersobject[]requis
    Propriétés
    • user_idintegerrequis
    • rolestring
      manager encoder reviewer
Exemple
{
    "members": [
        {
            "user_id": 12,
            "role": "manager"
        },
        {
            "user_id": 15,
            "role": "encoder"
        }
    ]
}

Réponses

200OK

application/json

Schéma Firm

Exemple
{
    "public_token": "NDTQVQU4AUAV",
    "name": "Fiduciaire Dumont & Associés",
    "enterprise_number": "0458662817",
    "vat_number": "BE0458662817",
    "itaa_number": "50.123.456",
    "itaa_status": "string",
    "itaa_quality": "string",
    "address": "Rue de Nimy 52",
    "postal_code": "7000",
    "city": "Mons",
    "website": "https://www.comptoir-montois.be",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "is_partner": true,
    "country_code": "BE",
    "locale": "fr",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "source": "local",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "can_manage": true,
    "members": [
        {
            "id": 12,
            "name": "Thomas Peeters",
            "email": "thomas.peeters@fiduciaire-dumont.be",
            "auth_source": "local",
            "locale": "fr",
            "role": "admin",
            "is_active": true,
            "all_companies": true,
            "companies": [
                {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL",
                    "code": "COMPTOIR",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ],
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "members": [
                {
                    "id": 42,
                    "name": "Thomas Peeters",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PUT "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/companies/XBVD5O1L29HC/members" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "members": [
        {
            "user_id": 12,
            "role": "manager"
        },
        {
            "user_id": 15,
            "role": "encoder"
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/companies/XBVD5O1L29HC/members', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'members' => [
            [
                'user_id' => 12,
                'role' => 'manager',
            ],
            [
                'user_id' => 15,
                'role' => 'encoder',
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/companies/XBVD5O1L29HC/members", {
  method: "PUT",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "members": [
          {
              "user_id": 12,
              "role": "manager"
          },
          {
              "user_id": 15,
              "role": "encoder"
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.put(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/companies/XBVD5O1L29HC/members",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "members": [
            {
                "user_id": 12,
                "role": "manager"
            },
            {
                "user_id": 15,
                "role": "encoder"
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/firms/{firm}/activityActivity of the firm read

Audit trail and history merged, newest first, for every company file of the firm. Admins and managers only (404 otherwise).

Integration tokens need the read ability.

Identifiant d'opération firms.activity

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Paramètres de requête

NomTypeDescription
companystringRestrict to one company file.
user_idinteger
fromstring <date>
tostring <date>
typestringAction or subject type.
sourcestring
audit revision
qstring
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma ActivityFeed

Exemple
{
    "data": [
        {
            "source": "audit",
            "at": "2026-03-15T09:41:00+00:00",
            "recorded_at": "2026-03-15T09:41:00+00:00",
            "user": null,
            "action": "entry.posted",
            "action_label": "Écriture validée",
            "subject_type": "string",
            "subject_id": 42,
            "subject_label": "string",
            "origin": "string",
            "device_name": "MacBook de Claire",
            "revision_id": 42,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "company_id": 7,
            "changed_fields": [
                "string"
            ],
            "company": {
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL"
            }
        }
    ],
    "current_page": 1,
    "per_page": 50,
    "has_more": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/activity" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/activity', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/activity", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/activity",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/firms/{firm}/files/viewSigned relay of a firm file URL signée 120 / 1 min

Serves the logo of a firm stored on Novadesko with CORS headers. The signed URL is found in logo_url of the firm payload.

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération firms.files.view

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Paramètres de requête

NomTypeDescription
url requisstring <uri>Relayed file.

Entêtes communs : signature expires

Réponses

200The file, inline.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

image/png

image/jpeg

image/webp

application/pdf

403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/files/view?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/files/view', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'query' => [
        'url' => 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/files/view?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/files/view",
    headers={
        "Accept": "application/json",
    },
    params={
        "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Licence & pricing

Licence of a firm, activation keys, public price list and simulator.

GET/v1/firms/{firm}/licenceLicence of the firm read

Plan, status, usage of the month, estimate of the next invoice, entitlements and limits.

Integration tokens need the read ability.

Identifiant d'opération firms.licence

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Paramètres de requête

NomTypeDescription
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Licence

Exemple
{
    "status": "none",
    "subscription": {},
    "plan": {},
    "usage": {
        "month": "2026-10",
        "companies": 25,
        "users": 4,
        "bank_accounts": 31,
        "rows": [
            {
                "company_id": 7,
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL",
                "code": "COMPTOIR",
                "bank_accounts": 1,
                "status": "active",
                "activated_at": "2026-03-15T09:41:00+00:00",
                "deactivated_at": "2026-03-15T09:41:00+00:00"
            }
        ],
        "max_companies": 1,
        "over_limit": false,
        "suggestion": "string"
    },
    "estimate": {},
    "companies_detail": [
        {
            "company_id": 7,
            "name": "Le Comptoir Montois SRL",
            "public_token": "XBVD5O1L29HC",
            "status": "active",
            "activated_at": "2026-03-15T09:41:00+00:00",
            "deactivated_at": "2026-03-15T09:41:00+00:00",
            "billable": true
        }
    ],
    "next_month_preview": {
        "companies": 25,
        "total": 121.5
    },
    "over_limit": false,
    "over_limit_firm_total": 12.5,
    "entitlements": {
        "accounting": true,
        "peppol": true,
        "coda": true,
        "client_portal": true,
        "client_invoicing": true,
        "document_import": true
    },
    "limits": {
        "max_users": 1,
        "max_companies": 1,
        "users_count": 4,
        "companies_count": 25
    },
    "expires_at": "2026-03-15T09:41:00+00:00",
    "warning": "string",
    "activation": {},
    "statements": [
        {}
    ],
    "options_available": [
        {
            "code": "client_portal",
            "name": "Portail client",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "can_manage": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/firms/{firm}/licence/activateActivate a licence key Jeton de session Hors démo 10 / 1 min

Creates or replaces the subscription of the firm.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • invalid_key: unknown key
  • expired_key: key past its validity
  • exhausted_key: every activation of the key is used
  • key_reserved: key reserved for another firm
  • already_active: the key is already active on this firm

Identifiant d'opération firms.licence.activate

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • keystringrequis
    Licence key.
    ex. NVFK-7Q2M-X4TA-9LDP
Exemple
{
    "key": "NVFK-7Q2M-X4TA-9LDP"
}

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma Licence

Exemple
{
    "status": "none",
    "subscription": {},
    "plan": {},
    "usage": {
        "month": "2026-10",
        "companies": 25,
        "users": 4,
        "bank_accounts": 31,
        "rows": [
            {
                "company_id": 7,
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL",
                "code": "COMPTOIR",
                "bank_accounts": 1,
                "status": "active",
                "activated_at": "2026-03-15T09:41:00+00:00",
                "deactivated_at": "2026-03-15T09:41:00+00:00"
            }
        ],
        "max_companies": 1,
        "over_limit": false,
        "suggestion": "string"
    },
    "estimate": {},
    "companies_detail": [
        {
            "company_id": 7,
            "name": "Le Comptoir Montois SRL",
            "public_token": "XBVD5O1L29HC",
            "status": "active",
            "activated_at": "2026-03-15T09:41:00+00:00",
            "deactivated_at": "2026-03-15T09:41:00+00:00",
            "billable": true
        }
    ],
    "next_month_preview": {
        "companies": 25,
        "total": 121.5
    },
    "over_limit": false,
    "over_limit_firm_total": 12.5,
    "entitlements": {
        "accounting": true,
        "peppol": true,
        "coda": true,
        "client_portal": true,
        "client_invoicing": true,
        "document_import": true
    },
    "limits": {
        "max_users": 1,
        "max_companies": 1,
        "users_count": 4,
        "companies_count": 25
    },
    "expires_at": "2026-03-15T09:41:00+00:00",
    "warning": "string",
    "activation": {},
    "statements": [
        {}
    ],
    "options_available": [
        {
            "code": "client_portal",
            "name": "Portail client",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "can_manage": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "key": "NVFK-7Q2M-X4TA-9LDP"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'key' => 'NVFK-7Q2M-X4TA-9LDP',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "key": "NVFK-7Q2M-X4TA-9LDP"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "key": "NVFK-7Q2M-X4TA-9LDP"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/firms/{firm}/licence/activationRelease the licence key Jeton de session Hors démo

The subscription that depends on the key is cancelled.

Session token only: integration tokens are refused with 403 session_token_required.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.licence.release

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Licence

Exemple
{
    "status": "none",
    "subscription": {},
    "plan": {},
    "usage": {
        "month": "2026-10",
        "companies": 25,
        "users": 4,
        "bank_accounts": 31,
        "rows": [
            {
                "company_id": 7,
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL",
                "code": "COMPTOIR",
                "bank_accounts": 1,
                "status": "active",
                "activated_at": "2026-03-15T09:41:00+00:00",
                "deactivated_at": "2026-03-15T09:41:00+00:00"
            }
        ],
        "max_companies": 1,
        "over_limit": false,
        "suggestion": "string"
    },
    "estimate": {},
    "companies_detail": [
        {
            "company_id": 7,
            "name": "Le Comptoir Montois SRL",
            "public_token": "XBVD5O1L29HC",
            "status": "active",
            "activated_at": "2026-03-15T09:41:00+00:00",
            "deactivated_at": "2026-03-15T09:41:00+00:00",
            "billable": true
        }
    ],
    "next_month_preview": {
        "companies": 25,
        "total": 121.5
    },
    "over_limit": false,
    "over_limit_firm_total": 12.5,
    "entitlements": {
        "accounting": true,
        "peppol": true,
        "coda": true,
        "client_portal": true,
        "client_invoicing": true,
        "document_import": true
    },
    "limits": {
        "max_users": 1,
        "max_companies": 1,
        "users_count": 4,
        "companies_count": 25
    },
    "expires_at": "2026-03-15T09:41:00+00:00",
    "warning": "string",
    "activation": {},
    "statements": [
        {}
    ],
    "options_available": [
        {
            "code": "client_portal",
            "name": "Portail client",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "can_manage": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activation" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activation', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activation", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/licence/activation",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/pricingPublic price list Public 120 / 1 min

Plans, tiers and options, excl. VAT, per month. Cached five minutes.

Public endpoint: no bearer token.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération pricing

Paramètres de requête

NomTypeDescription
localestring
fr nl en de

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PricingGrid

Exemple
{
    "currency": "EUR",
    "vat_included": false,
    "plans": [
        {
            "code": "starter",
            "name": "Firm",
            "kind": "starter",
            "base_price_monthly": 49,
            "per_company": 2.9,
            "tiers": [
                {
                    "up_to": 100,
                    "price": 2.9
                }
            ],
            "max_companies": 1,
            "peppol_fair_use_per_company": 100,
            "annual_discount_pct": 10,
            "included": [
                "Unlimited users"
            ]
        }
    ],
    "options": [
        {
            "code": "client_portal",
            "name": "Client portal",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "annual_discount_pct": 10,
    "winauditor": {},
    "pilot": {
        "free_months": 3,
        "max_firms": 20
    }
}
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/pricing" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/pricing', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/pricing", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/pricing",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/pricing/simulatePrice simulator Public 120 / 1 min

Public endpoint: no bearer token.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération pricing.simulate

Paramètres de requête

NomTypeDescription
companies requisintegerNumber of company files.
ex. 25
client_portalintegerClients with the portal option.
client_invoicingintegerClients with the invoicing option.
yearlystringYearly billing.
0 1 true false
localestring
fr nl en de

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PricingSimulation

Exemple
{
    "companies": 25,
    "yearly": false,
    "starter": {},
    "firm": {
        "plan": "firm",
        "billing_interval": "monthly",
        "companies": 25,
        "base": 49,
        "companies_breakdown": [
            {
                "from": 1,
                "to": 100,
                "quantity": 25,
                "unit_price": 2.9,
                "total": 72.5
            }
        ],
        "companies_total": 72.5,
        "options": [
            {}
        ],
        "options_total": 0,
        "pilot_discount": 0,
        "annual_discount_pct": 0,
        "annual_discount": 0,
        "discount": 0,
        "total": 121.5,
        "yearly_total": 1458,
        "name": "Firm",
        "saving_vs_winauditor": 36,
        "saving_pct": 22.9
    },
    "winauditor": 157.5,
    "cheapest": "starter"
}
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/pricing/simulate?companies=25" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/pricing/simulate', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'query' => [
        'companies' => '25',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/pricing/simulate?companies=25", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/pricing/simulate",
    headers={
        "Accept": "application/json",
    },
    params={
        "companies": "25"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Companies

Company files (dossiers): creation with accounting set-up, identity, settings, integrity.

GET/v1/companiesList the company files read

Every company file the user can open: all files of the firms it administers or manages, plus the files it is assigned to.

Integration tokens need the read ability.

Identifiant d'opération companies.index

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Company[]

Tableau de Company

Exemple
[
    {
        "id": 7,
        "public_token": "XBVD5O1L29HC",
        "firm_id": 3,
        "code": "COMPTOIR",
        "name": "Le Comptoir Montois SRL",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "country_pack": "BE",
        "vat_regime": "monthly",
        "currency": "EUR",
        "locale": "fr",
        "address": "Grand-Place 14, 7000 Mons",
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE",
        "latitude": "50.4541000",
        "longitude": "3.9523000",
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN"
            }
        ],
        "main_nace_code": "56111",
        "company_sheet_at": "2026-03-15T09:41:00+00:00",
        "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "fiscal_year_start": "2026-03-15",
        "fiscal_year_end": "2026-03-15",
        "settings": {
            "vat": {
                "administration_cell": "string",
                "structured_communication": "000000000101",
                "directorate_number": "string",
                "office_number": "string",
                "declarant": {
                    "applicable": false,
                    "company_name": "string",
                    "signatory_1": "string",
                    "signatory_1_title": "string",
                    "signatory_2": "string",
                    "signatory_2_title": "string",
                    "phone": "+32 65 31 42 18",
                    "fax": "string",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "language": "fr"
                },
                "sender_281_50": {
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "address": "Grand-Place 14",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                },
                "filer": {
                    "quality": "company",
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                }
            },
            "legal": {
                "rpm_district": "Hainaut, division Mons"
            },
            "annual_accounts": {
                "scheme": "abbreviated",
                "general_meeting_date": "2026-03-15",
                "directors": "string",
                "valuation_rules": "string"
            },
            "auto_entries": {
                "vat": {
                    "payable_account": "451000",
                    "receivable_account": "411000",
                    "correction_payable_account": "string",
                    "correction_receivable_account": "string",
                    "journal_id": 3
                },
                "invoices_to_receive": {
                    "supplier_account": "444000",
                    "customer_account": "404000",
                    "journal_id": 3
                },
                "reconciliation_difference": {
                    "expense_account": "657000",
                    "income_account": "757000",
                    "max_amount": 1
                },
                "transfers": {
                    "transit_account": "580000",
                    "journal_id": 3
                }
            },
            "history": {
                "trash_retention_days": 90
            }
        },
        "is_active": true,
        "is_demo": false,
        "source": "manual",
        "external_id": "string",
        "synced_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal_entries_count": 1284,
        "firm": {
            "id": 3,
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        },
        "fiscal_years": [
            {
                "id": 2,
                "company_id": 7,
                "code": "2026",
                "starts_on": "2026-01-01T00:00:00.000000Z",
                "ends_on": "2026-12-31T00:00:00.000000Z",
                "is_closed": false,
                "closed_at": "2026-03-15T09:41:00+00:00",
                "closed_by": 1,
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "periods": [
                    {}
                ]
            }
        ],
        "journals": [
            {
                "id": 3,
                "company_id": 7,
                "code": "VEN",
                "label": "Ventes",
                "type": "purchase",
                "control_account_id": 42,
                "iban": "BE68539007547034",
                "bic": "GEBABEBB",
                "last_number": 412,
                "is_active": true,
                "is_default": true,
                "description": "Description",
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "deleted_at": "2026-03-15T09:41:00+00:00",
                "deleted_by": 1,
                "entries_count": 412,
                "control_account": null,
                "rules": [
                    {}
                ]
            }
        ]
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companiesCreate a company file write Hors démo

Creates the file and initialises its accounting: chart of accounts of the country pack (PCMN for BE), VAT codes, journals (ACH, NCA, VEN, NCV, OD, CAI and one financial journal per bank) and the first fiscal year with its periods. firm is optional when the user manages exactly one firm; without a firm the file is standalone.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • company_limit_reached: the licence or the plan does not allow one more company file

Identifiant d'opération companies.store

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • firmstring | null
    Firm that manages the file.
  • country_packstring
    BE FR LU
  • codestring | null
    Short code, letters, digits, dash, underscore (20 max).
  • namestringrequis
    200 characters max.
  • enterprise_numberstring | null
    Checked against the country rules (BE: modulo 97).
  • vat_numberstring | null
    Format and check digits validated per country.
  • legal_formstring | null
  • legal_form_codestring | null
    Code of GET /v1/reference/legal-forms.
  • addressstring | null
  • logo_urlstring <uri> | null
  • vat_regimestring
    monthly quarterly franchise exempt unit
  • localestring
    fr nl en de
  • streetstring | null
  • house_numberstring | null
  • boxstring | null
  • postal_codestring | null
  • citystring | null
  • countrystring | null
    ISO 3166-1 alpha-2.
  • latitudenumber | null
  • longitudenumber | null
  • nace_codesobject[]
    Propriétés
    • codestringrequis
    • classificationstring
      MAIN SECO ANCI
  • main_nace_codestring | null
  • fiscal_yearobject
    Propriétés
    • codestring
      10 characters max.
    • starts_onstring <date>requis
    • ends_onstring <date>requis
  • banksobject[]
    Propriétés
    • codestringrequis
      Journal code, 6 characters max.
    • labelstringrequis
    • ibanstring | null
Exemple
{
    "firm": "NDTQVQU4AUAV",
    "country_pack": "BE",
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "enterprise_number": "0477.472.701",
    "legal_form_code": "610",
    "vat_regime": "quarterly",
    "street": "Grand-Place",
    "house_number": "14",
    "postal_code": "7000",
    "city": "Mons",
    "fiscal_year": {
        "code": "2026",
        "starts_on": "2026-01-01",
        "ends_on": "2026-12-31"
    },
    "banks": [
        {
            "code": "BNP",
            "label": "BNP Paribas Fortis",
            "iban": "BE68 5390 0754 7034"
        }
    ]
}

Réponses

201Created

application/json

Schéma Company

Exemple
{
    "id": 7,
    "public_token": "XBVD5O1L29HC",
    "firm_id": 3,
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "country_pack": "BE",
    "vat_regime": "monthly",
    "currency": "EUR",
    "locale": "fr",
    "address": "Grand-Place 14, 7000 Mons",
    "street": "Grand-Place",
    "house_number": "14",
    "box": "string",
    "postal_code": "7000",
    "city": "Mons",
    "country": "BE",
    "latitude": "50.4541000",
    "longitude": "3.9523000",
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN"
        }
    ],
    "main_nace_code": "56111",
    "company_sheet_at": "2026-03-15T09:41:00+00:00",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "fiscal_year_start": "2026-03-15",
    "fiscal_year_end": "2026-03-15",
    "settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "is_active": true,
    "is_demo": false,
    "source": "manual",
    "external_id": "string",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entries_count": 1284,
    "firm": {
        "id": 3,
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "fiscal_years": [
        {
            "id": 2,
            "company_id": 7,
            "code": "2026",
            "starts_on": "2026-01-01T00:00:00.000000Z",
            "ends_on": "2026-12-31T00:00:00.000000Z",
            "is_closed": false,
            "closed_at": "2026-03-15T09:41:00+00:00",
            "closed_by": 1,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "periods": [
                {}
            ]
        }
    ],
    "journals": [
        {
            "id": 3,
            "company_id": 7,
            "code": "VEN",
            "label": "Ventes",
            "type": "purchase",
            "control_account_id": 42,
            "iban": "BE68539007547034",
            "bic": "GEBABEBB",
            "last_number": 412,
            "is_active": true,
            "is_default": true,
            "description": "Description",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "entries_count": 412,
            "control_account": null,
            "rules": [
                {}
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "firm": "NDTQVQU4AUAV",
    "country_pack": "BE",
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "enterprise_number": "0477.472.701",
    "legal_form_code": "610",
    "vat_regime": "quarterly",
    "street": "Grand-Place",
    "house_number": "14",
    "postal_code": "7000",
    "city": "Mons",
    "fiscal_year": {
        "code": "2026",
        "starts_on": "2026-01-01",
        "ends_on": "2026-12-31"
    },
    "banks": [
        {
            "code": "BNP",
            "label": "BNP Paribas Fortis",
            "iban": "BE68 5390 0754 7034"
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'firm' => 'NDTQVQU4AUAV',
        'country_pack' => 'BE',
        'code' => 'COMPTOIR',
        'name' => 'Le Comptoir Montois SRL',
        'enterprise_number' => '0477.472.701',
        'legal_form_code' => '610',
        'vat_regime' => 'quarterly',
        'street' => 'Grand-Place',
        'house_number' => '14',
        'postal_code' => '7000',
        'city' => 'Mons',
        'fiscal_year' => [
            'code' => '2026',
            'starts_on' => '2026-01-01',
            'ends_on' => '2026-12-31',
        ],
        'banks' => [
            [
                'code' => 'BNP',
                'label' => 'BNP Paribas Fortis',
                'iban' => 'BE68 5390 0754 7034',
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "firm": "NDTQVQU4AUAV",
      "country_pack": "BE",
      "code": "COMPTOIR",
      "name": "Le Comptoir Montois SRL",
      "enterprise_number": "0477.472.701",
      "legal_form_code": "610",
      "vat_regime": "quarterly",
      "street": "Grand-Place",
      "house_number": "14",
      "postal_code": "7000",
      "city": "Mons",
      "fiscal_year": {
          "code": "2026",
          "starts_on": "2026-01-01",
          "ends_on": "2026-12-31"
      },
      "banks": [
          {
              "code": "BNP",
              "label": "BNP Paribas Fortis",
              "iban": "BE68 5390 0754 7034"
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "firm": "NDTQVQU4AUAV",
        "country_pack": "BE",
        "code": "COMPTOIR",
        "name": "Le Comptoir Montois SRL",
        "enterprise_number": "0477.472.701",
        "legal_form_code": "610",
        "vat_regime": "quarterly",
        "street": "Grand-Place",
        "house_number": "14",
        "postal_code": "7000",
        "city": "Mons",
        "fiscal_year": {
            "code": "2026",
            "starts_on": "2026-01-01",
            "ends_on": "2026-12-31"
        },
        "banks": [
            {
                "code": "BNP",
                "label": "BNP Paribas Fortis",
                "iban": "BE68 5390 0754 7034"
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}Company file read

With its fiscal years, periods and journals.

Integration tokens need the read ability.

Identifiant d'opération companies.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Company

Exemple
{
    "id": 7,
    "public_token": "XBVD5O1L29HC",
    "firm_id": 3,
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "country_pack": "BE",
    "vat_regime": "monthly",
    "currency": "EUR",
    "locale": "fr",
    "address": "Grand-Place 14, 7000 Mons",
    "street": "Grand-Place",
    "house_number": "14",
    "box": "string",
    "postal_code": "7000",
    "city": "Mons",
    "country": "BE",
    "latitude": "50.4541000",
    "longitude": "3.9523000",
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN"
        }
    ],
    "main_nace_code": "56111",
    "company_sheet_at": "2026-03-15T09:41:00+00:00",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "fiscal_year_start": "2026-03-15",
    "fiscal_year_end": "2026-03-15",
    "settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "is_active": true,
    "is_demo": false,
    "source": "manual",
    "external_id": "string",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entries_count": 1284,
    "firm": {
        "id": 3,
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "fiscal_years": [
        {
            "id": 2,
            "company_id": 7,
            "code": "2026",
            "starts_on": "2026-01-01T00:00:00.000000Z",
            "ends_on": "2026-12-31T00:00:00.000000Z",
            "is_closed": false,
            "closed_at": "2026-03-15T09:41:00+00:00",
            "closed_by": 1,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "periods": [
                {}
            ]
        }
    ],
    "journals": [
        {
            "id": 3,
            "company_id": 7,
            "code": "VEN",
            "label": "Ventes",
            "type": "purchase",
            "control_account_id": 42,
            "iban": "BE68539007547034",
            "bic": "GEBABEBB",
            "last_number": 412,
            "is_active": true,
            "is_default": true,
            "description": "Description",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "entries_count": 412,
            "control_account": null,
            "rules": [
                {}
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}Update a company file write

Identity and / or settings. Settings are merged key by key: send only the keys to change; only known keys are accepted.

Integration tokens need the write ability.

Identifiant d'opération companies.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • codestring | null
    Short code, letters, digits, dash, underscore (20 max).
  • namestring
    200 characters max.
  • enterprise_numberstring | null
    Checked against the country rules (BE: modulo 97).
  • vat_numberstring | null
    Format and check digits validated per country.
  • legal_formstring | null
  • legal_form_codestring | null
    Code of GET /v1/reference/legal-forms.
  • addressstring | null
  • logo_urlstring <uri> | null
  • vat_regimestring
    monthly quarterly franchise exempt unit
  • localestring
    fr nl en de
  • streetstring | null
  • house_numberstring | null
  • boxstring | null
  • postal_codestring | null
  • citystring | null
  • countrystring | null
    ISO 3166-1 alpha-2.
  • latitudenumber | null
  • longitudenumber | null
  • nace_codesobject[]
    Propriétés
    • codestringrequis
    • classificationstring
      MAIN SECO ANCI
  • main_nace_codestring | null
Exemple
{
    "vat_regime": "monthly",
    "settings": {
        "vat": {
            "office_number": "0420"
        },
        "auto_entries": {
            "reconciliation_difference": {
                "max_amount": 2.5
            }
        }
    }
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Company

Exemple
{
    "id": 7,
    "public_token": "XBVD5O1L29HC",
    "firm_id": 3,
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "country_pack": "BE",
    "vat_regime": "monthly",
    "currency": "EUR",
    "locale": "fr",
    "address": "Grand-Place 14, 7000 Mons",
    "street": "Grand-Place",
    "house_number": "14",
    "box": "string",
    "postal_code": "7000",
    "city": "Mons",
    "country": "BE",
    "latitude": "50.4541000",
    "longitude": "3.9523000",
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN"
        }
    ],
    "main_nace_code": "56111",
    "company_sheet_at": "2026-03-15T09:41:00+00:00",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "fiscal_year_start": "2026-03-15",
    "fiscal_year_end": "2026-03-15",
    "settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "is_active": true,
    "is_demo": false,
    "source": "manual",
    "external_id": "string",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entries_count": 1284,
    "firm": {
        "id": 3,
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "fiscal_years": [
        {
            "id": 2,
            "company_id": 7,
            "code": "2026",
            "starts_on": "2026-01-01T00:00:00.000000Z",
            "ends_on": "2026-12-31T00:00:00.000000Z",
            "is_closed": false,
            "closed_at": "2026-03-15T09:41:00+00:00",
            "closed_by": 1,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "periods": [
                {}
            ]
        }
    ],
    "journals": [
        {
            "id": 3,
            "company_id": 7,
            "code": "VEN",
            "label": "Ventes",
            "type": "purchase",
            "control_account_id": 42,
            "iban": "BE68539007547034",
            "bic": "GEBABEBB",
            "last_number": 412,
            "is_active": true,
            "is_default": true,
            "description": "Description",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "entries_count": 412,
            "control_account": null,
            "rules": [
                {}
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "vat_regime": "monthly",
    "settings": {
        "vat": {
            "office_number": "0420"
        },
        "auto_entries": {
            "reconciliation_difference": {
                "max_amount": 2.5
            }
        }
    }
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'vat_regime' => 'monthly',
        'settings' => [
            'vat' => [
                'office_number' => '0420',
            ],
            'auto_entries' => [
                'reconciliation_difference' => [
                    'max_amount' => 2.5,
                ],
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "vat_regime": "monthly",
      "settings": {
          "vat": {
              "office_number": "0420"
          },
          "auto_entries": {
              "reconciliation_difference": {
                  "max_amount": 2.5
              }
          }
      }
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "vat_regime": "monthly",
        "settings": {
            "vat": {
                "office_number": "0420"
            },
            "auto_entries": {
                "reconciliation_difference": {
                    "max_amount": 2.5
                }
            }
        }
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}Delete a company file write Hors démo

Soft delete: the file disappears from every list.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération companies.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/integrityIntegrity check read

Sum of debits and credits over every entry of the file.

Integration tokens need the read ability.

Identifiant d'opération companies.integrity

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • debitnumber
    ex. 184320.55
  • creditnumber
    ex. 184320.55
  • entriesinteger
    ex. 1284
  • is_balancedboolean
Exemple
{
    "debit": 184320.55,
    "credit": 184320.55,
    "entries": 1284,
    "is_balanced": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrity" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrity', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrity", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrity",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/settingsResolved settings read

Settings of the file with the journals available for the selectors.

Integration tokens need the read ability.

Identifiant d'opération companies.settings

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • journalsobject[]
    Propriétés
    • idinteger
    • codestring
      ex. OD
    • labelstring
      ex. Opérations diverses
    • typestring
      ex. miscellaneous
Exemple
{
    "settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "journals": [
        {
            "id": 42,
            "code": "OD",
            "label": "Opérations diverses",
            "type": "miscellaneous"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/settings" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/settings', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/settings", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/settings",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Lookup

Company detection (CompanySearch for BE and FR, VIES elsewhere), legal forms, NACE codes, address autocompletion.

GET/v1/companies/{company}/sheetCompany sheet of the file read

Sheet stored on the file (last detection), structured address, legal form, NACE codes and map links.

Integration tokens need the read ability.

Identifiant d'opération companies.sheet

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma SheetView

Exemple
{
    "sheet": {
        "identifier": "0477472701",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "name": "Le Comptoir Montois",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "status": "active",
        "start_date": "2026-03-15",
        "address": {
            "street": "Grand-Place",
            "house_number": "14",
            "box": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        },
        "address_line": "string",
        "latitude": 12.5,
        "longitude": 12.5,
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN",
                "label": "Facture Brasserie Dubuisson"
            }
        ],
        "main_nace_code": "string",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "phone": "+32 65 31 42 18",
        "website": "https://www.comptoir-montois.be",
        "source": "companysearch",
        "fetched_at": "2026-03-15T09:41:00+00:00",
        "map": {
            "query": "Grand-Place 14, 7000 Mons, Belgique",
            "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "latitude": 12.5,
            "longitude": 12.5
        }
    },
    "sheet_at": "2026-03-15T09:41:00+00:00",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "legal_form": {},
    "nace_codes": [
        {
            "code": "COMPTOIR",
            "classification": "string",
            "label": "Facture Brasserie Dubuisson",
            "is_main": true
        }
    ],
    "main_nace_code": "string",
    "vat_number_formatted": "BE 0477.472.701",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sheet" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sheet', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sheet", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sheet",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/apply-sheetFill the file from a company sheet write Hors démo 30 / 1 min

Looks the company up and copies name, legal form, address, NACE codes and VAT number to the file (empty fields only unless overwrite).

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.apply-sheet

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • identifierstringrequis
    Enterprise or VAT number.
    ex. 0477472701
  • refreshboolean | null
    Ignore the 24 h cache.
  • overwriteboolean | null
    Replace the fields already filled in.
Exemple
{
    "identifier": "0477472701",
    "refresh": true,
    "overwrite": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "company": {
        "id": 7,
        "public_token": "XBVD5O1L29HC",
        "firm_id": 3,
        "code": "COMPTOIR",
        "name": "Le Comptoir Montois SRL",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "country_pack": "BE",
        "vat_regime": "monthly",
        "currency": "EUR",
        "locale": "fr",
        "address": "Grand-Place 14, 7000 Mons",
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE",
        "latitude": "50.4541000",
        "longitude": "3.9523000",
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN"
            }
        ],
        "main_nace_code": "56111",
        "company_sheet_at": "2026-03-15T09:41:00+00:00",
        "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "fiscal_year_start": "2026-03-15",
        "fiscal_year_end": "2026-03-15",
        "settings": {
            "vat": {
                "administration_cell": "string",
                "structured_communication": "000000000101",
                "directorate_number": "string",
                "office_number": "string",
                "declarant": {
                    "applicable": false,
                    "company_name": "string",
                    "signatory_1": "string",
                    "signatory_1_title": "string",
                    "signatory_2": "string",
                    "signatory_2_title": "string",
                    "phone": "+32 65 31 42 18",
                    "fax": "string",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "language": "fr"
                },
                "sender_281_50": {
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "address": "Grand-Place 14",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                },
                "filer": {
                    "quality": "company",
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                }
            },
            "legal": {
                "rpm_district": "Hainaut, division Mons"
            },
            "annual_accounts": {
                "scheme": "abbreviated",
                "general_meeting_date": "2026-03-15",
                "directors": "string",
                "valuation_rules": "string"
            },
            "auto_entries": {
                "vat": {
                    "payable_account": "451000",
                    "receivable_account": "411000",
                    "correction_payable_account": "string",
                    "correction_receivable_account": "string",
                    "journal_id": 3
                },
                "invoices_to_receive": {
                    "supplier_account": "444000",
                    "customer_account": "404000",
                    "journal_id": 3
                },
                "reconciliation_difference": {
                    "expense_account": "657000",
                    "income_account": "757000",
                    "max_amount": 1
                },
                "transfers": {
                    "transit_account": "580000",
                    "journal_id": 3
                }
            },
            "history": {
                "trash_retention_days": 90
            }
        },
        "is_active": true,
        "is_demo": false,
        "source": "manual",
        "external_id": "string",
        "synced_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal_entries_count": 1284,
        "firm": {
            "id": 3,
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        },
        "fiscal_years": [
            {
                "id": 2,
                "company_id": 7,
                "code": "2026",
                "starts_on": "2026-01-01T00:00:00.000000Z",
                "ends_on": "2026-12-31T00:00:00.000000Z",
                "is_closed": false,
                "closed_at": "2026-03-15T09:41:00+00:00",
                "closed_by": 1,
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "periods": [
                    {}
                ]
            }
        ],
        "journals": [
            {
                "id": 3,
                "company_id": 7,
                "code": "VEN",
                "label": "Ventes",
                "type": "purchase",
                "control_account_id": 42,
                "iban": "BE68539007547034",
                "bic": "GEBABEBB",
                "last_number": 412,
                "is_active": true,
                "is_default": true,
                "description": "Description",
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "deleted_at": "2026-03-15T09:41:00+00:00",
                "deleted_by": 1,
                "entries_count": 412,
                "control_account": null,
                "rules": [
                    {}
                ]
            }
        ]
    },
    "sheet": {
        "identifier": "0477472701",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "name": "Le Comptoir Montois",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "status": "active",
        "start_date": "2026-03-15",
        "address": {
            "street": "Grand-Place",
            "house_number": "14",
            "box": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        },
        "address_line": "string",
        "latitude": 12.5,
        "longitude": 12.5,
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN",
                "label": "Facture Brasserie Dubuisson"
            }
        ],
        "main_nace_code": "string",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "phone": "+32 65 31 42 18",
        "website": "https://www.comptoir-montois.be",
        "source": "companysearch",
        "fetched_at": "2026-03-15T09:41:00+00:00",
        "map": {
            "query": "Grand-Place 14, 7000 Mons, Belgique",
            "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "latitude": 12.5,
            "longitude": 12.5
        }
    },
    "map": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/apply-sheet" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "identifier": "0477472701",
    "refresh": true,
    "overwrite": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/apply-sheet', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'identifier' => '0477472701',
        'refresh' => true,
        'overwrite' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/apply-sheet", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "identifier": "0477472701",
      "refresh": true,
      "overwrite": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/apply-sheet",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "identifier": "0477472701",
        "refresh": True,
        "overwrite": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}/sheetCompany sheet of a third party read

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.sheet

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma SheetView

Exemple
{
    "sheet": {
        "identifier": "0477472701",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "name": "Le Comptoir Montois",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "status": "active",
        "start_date": "2026-03-15",
        "address": {
            "street": "Grand-Place",
            "house_number": "14",
            "box": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        },
        "address_line": "string",
        "latitude": 12.5,
        "longitude": 12.5,
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN",
                "label": "Facture Brasserie Dubuisson"
            }
        ],
        "main_nace_code": "string",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "phone": "+32 65 31 42 18",
        "website": "https://www.comptoir-montois.be",
        "source": "companysearch",
        "fetched_at": "2026-03-15T09:41:00+00:00",
        "map": {
            "query": "Grand-Place 14, 7000 Mons, Belgique",
            "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "latitude": 12.5,
            "longitude": 12.5
        }
    },
    "sheet_at": "2026-03-15T09:41:00+00:00",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "legal_form": {},
    "nace_codes": [
        {
            "code": "COMPTOIR",
            "classification": "string",
            "label": "Facture Brasserie Dubuisson",
            "is_main": true
        }
    ],
    "main_nace_code": "string",
    "vat_number_formatted": "BE 0477.472.701",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/sheet" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/sheet', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/sheet", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/sheet",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/apply-sheetFill a third party from a company sheet write Hors démo 30 / 1 min

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.third-parties.apply-sheet

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • identifierstringrequis
    Enterprise or VAT number.
    ex. 0477472701
  • refreshboolean | null
    Ignore the 24 h cache.
  • overwriteboolean | null
    Replace the fields already filled in.
Exemple
{
    "identifier": "0477472701",
    "refresh": true,
    "overwrite": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "third_party": {
        "id": 18,
        "company_id": 7,
        "type": "customer",
        "code": "DUBUISSON",
        "name": "Brasserie Dubuisson SA",
        "contact_name": "string",
        "vat_number": "BE0402531376",
        "enterprise_number": "0402531376",
        "legal_form_code": "string",
        "vat_status": "subject",
        "country": "BE",
        "language": "fr",
        "category": "string",
        "currency": "EUR",
        "address": "Chaussée de Mons 28",
        "house_number": "14",
        "box": "string",
        "address_line_2": "string",
        "postal_code": "7904",
        "city": "Pipaix",
        "nace_code": "string",
        "iban": "BE71096123456769",
        "bic": "GKCCBEBB",
        "bank_account": "string",
        "email": "compta@dubuisson.example",
        "phone": "+32 65 31 42 18",
        "fax": "string",
        "website": "https://www.comptoir-montois.be",
        "payment_terms_days": 30,
        "form_281_50_type": "string",
        "profession_281_50": "string",
        "is_natural_person": false,
        "notes": "string",
        "default_vat_code_id": 42,
        "default_account_id": 42,
        "vies_valid": true,
        "vies_checked_at": "2026-03-15T09:41:00+00:00",
        "vies_name": "string",
        "peppol_identifier": "0208:0402531376",
        "peppol_registered": true,
        "peppol_access_point": {},
        "peppol_document_types": [
            {
                "id": "bis_billing_invoice",
                "name": "Invoice BIS Billing 3.0",
                "family": "billing",
                "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
                "document_id": "string"
            }
        ],
        "peppol_checked_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "default_account": {},
        "default_vat_code": {}
    },
    "sheet": {
        "identifier": "0477472701",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "name": "Le Comptoir Montois",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "status": "active",
        "start_date": "2026-03-15",
        "address": {
            "street": "Grand-Place",
            "house_number": "14",
            "box": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        },
        "address_line": "string",
        "latitude": 12.5,
        "longitude": 12.5,
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN",
                "label": "Facture Brasserie Dubuisson"
            }
        ],
        "main_nace_code": "string",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "phone": "+32 65 31 42 18",
        "website": "https://www.comptoir-montois.be",
        "source": "companysearch",
        "fetched_at": "2026-03-15T09:41:00+00:00",
        "map": {
            "query": "Grand-Place 14, 7000 Mons, Belgique",
            "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "latitude": 12.5,
            "longitude": 12.5
        }
    },
    "map": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/apply-sheet" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "identifier": "0477472701",
    "refresh": true,
    "overwrite": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/apply-sheet', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'identifier' => '0477472701',
        'refresh' => true,
        'overwrite' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/apply-sheet", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "identifier": "0477472701",
      "refresh": true,
      "overwrite": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/apply-sheet",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "identifier": "0477472701",
        "refresh": True,
        "overwrite": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/reference/naceNACE codes read

Search in the NACE-BEL nomenclature by code or words.

Integration tokens need the read ability.

Identifiant d'opération reference.nace

Paramètres de requête

NomTypeDescription
countrystring
ex. BE
qstring
ex. restauration
limitinteger1 to 200, 30 by default.
levelinteger1 to 7.
editionstring
ex. 2025
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • dataobject[]
    Propriétés
    • codestring
      ex. 56111
    • labelstring
      ex. Restauration à service complet
    • label_frstring
    • label_nlstring
    • label_destring
    • label_enstring
    • levelinteger
      ex. 5
    • editionstring
      ex. 2025
  • countrystring
  • nomenclature_countrystring
  • localestring
Exemple
{
    "data": [
        {
            "code": "56111",
            "label": "Restauration à service complet",
            "label_fr": "string",
            "label_nl": "string",
            "label_de": "string",
            "label_en": "string",
            "level": 5,
            "edition": "2025"
        }
    ],
    "country": "BE",
    "nomenclature_country": "string",
    "locale": "fr"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/reference/nace" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/reference/nace', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/reference/nace", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/reference/nace",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/lookup/capabilitiesLookup capabilities of a country read

What the detection can do for a country: BE and FR through CompanySearch (search, sheet, cities, streets), other EU countries through VIES (VAT check only).

Integration tokens need the read ability.

Identifiant d'opération lookup.capabilities

Paramètres de requête

NomTypeDescription
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • countrystring
    ex. BE
  • searchboolean
  • sheetboolean
  • vatboolean
  • citiesboolean
  • streetsboolean
  • sourcestring
    ex. companysearch
  • provider_configuredboolean
Exemple
{
    "country": "BE",
    "search": true,
    "sheet": true,
    "vat": true,
    "cities": true,
    "streets": true,
    "source": "companysearch",
    "provider_configured": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/lookup/capabilities" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/lookup/capabilities', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/lookup/capabilities", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/lookup/capabilities",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/lookup/companies/{identifier}Company sheet read Hors démo 60 / 1 min

Normalised sheet of a company, cached 24 hours.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération lookup.companies.show

Paramètres de chemin

NomTypeDescription
identifier requisstringEnterprise number or VAT number of the company to look up.
ex. 0477472701

Paramètres de requête

NomTypeDescription
countrystring
refreshbooleanIgnore the cache.
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma CompanySheet

Exemple
{
    "identifier": "0477472701",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "name": "Le Comptoir Montois",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "status": "active",
    "start_date": "2026-03-15",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "latitude": 12.5,
    "longitude": 12.5,
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN",
            "label": "Facture Brasserie Dubuisson"
        }
    ],
    "main_nace_code": "string",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "website": "https://www.comptoir-montois.be",
    "source": "companysearch",
    "fetched_at": "2026-03-15T09:41:00+00:00",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/lookup/companies/0477472701" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/lookup/companies/0477472701', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/lookup/companies/0477472701", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/lookup/companies/0477472701",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/lookup/vatCheck a VAT number read Hors démo 60 / 1 min

Format, check digits and existence, with the Peppol status when known.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération lookup.vat

Paramètres de requête

NomTypeDescription
vat requisstring
ex. BE0477472701
countrystring

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • validboolean | null
  • valid_formatboolean
  • vat_numberstring
  • enterprise_numberstring | null
  • namestring | null
  • address_linestring | null
  • statusstring | null
  • peppolobject | null
  • reasonstring | null
  • sourcestring
Exemple
{
    "valid": true,
    "valid_format": true,
    "vat_number": "BE0477472701",
    "enterprise_number": "0477472701",
    "name": "Le Comptoir Montois SRL",
    "address_line": "string",
    "status": "active",
    "peppol": {},
    "reason": "string",
    "source": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/lookup/vat?vat=BE0477472701" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/lookup/vat', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'vat' => 'BE0477472701',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/lookup/vat?vat=BE0477472701", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/lookup/vat",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "vat": "BE0477472701"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/lookup/citiesCity autocompletion read Hors démo 120 / 1 min

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération lookup.cities

Paramètres de requête

NomTypeDescription
q requisstring
ex. Mons
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • dataobject[]
    Propriétés
    • postal_codestring
      ex. 7000
    • citystring
      ex. Mons
    • city_frstring | null
    • city_nlstring | null
      ex. Bergen
    • countrystring
      ex. BE
Exemple
{
    "data": [
        {
            "postal_code": "7000",
            "city": "Mons",
            "city_fr": "string",
            "city_nl": "Bergen",
            "country": "BE"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/lookup/cities?q=Mons" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/lookup/cities', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'q' => 'Mons',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/lookup/cities?q=Mons", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/lookup/cities",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "q": "Mons"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/lookup/streetsStreet autocompletion read Hors démo 120 / 1 min

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération lookup.streets

Paramètres de requête

NomTypeDescription
zipcode requisstringFour digits.
ex. 7000
qstring
ex. Grand
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • dataobject[]
    Propriétés
    • streetstring
      ex. Grand-Place
    • street_frstring | null
    • street_nlstring | null
    • postal_codestring
    • citystring
    • countrystring
Exemple
{
    "data": [
        {
            "street": "Grand-Place",
            "street_fr": "string",
            "street_nl": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/lookup/streets?zipcode=7000" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/lookup/streets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'zipcode' => '7000',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/lookup/streets?zipcode=7000", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/lookup/streets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "zipcode": "7000"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/lookup/capabilitiesLookup capabilities of a country read

What the detection can do for a country: BE and FR through CompanySearch (search, sheet, cities, streets), other EU countries through VIES (VAT check only). The call is attributed to the company file.

Integration tokens need the read ability.

Identifiant d'opération companies.lookup.capabilities

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • countrystring
    ex. BE
  • searchboolean
  • sheetboolean
  • vatboolean
  • citiesboolean
  • streetsboolean
  • sourcestring
    ex. companysearch
  • provider_configuredboolean
Exemple
{
    "country": "BE",
    "search": true,
    "sheet": true,
    "vat": true,
    "cities": true,
    "streets": true,
    "source": "companysearch",
    "provider_configured": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/capabilities" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/capabilities', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/capabilities", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/capabilities",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/lookup/companies/{identifier}Company sheet read Hors démo 60 / 1 min

Normalised sheet of a company, cached 24 hours. The call is attributed to the company file.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.lookup.companies.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
identifier requisstringEnterprise number or VAT number of the company to look up.
ex. 0477472701

Paramètres de requête

NomTypeDescription
countrystring
refreshbooleanIgnore the cache.
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma CompanySheet

Exemple
{
    "identifier": "0477472701",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "name": "Le Comptoir Montois",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "status": "active",
    "start_date": "2026-03-15",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "latitude": 12.5,
    "longitude": 12.5,
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN",
            "label": "Facture Brasserie Dubuisson"
        }
    ],
    "main_nace_code": "string",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "website": "https://www.comptoir-montois.be",
    "source": "companysearch",
    "fetched_at": "2026-03-15T09:41:00+00:00",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/companies/0477472701" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/companies/0477472701', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/companies/0477472701", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/companies/0477472701",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/lookup/vatCheck a VAT number read Hors démo 60 / 1 min

Format, check digits and existence, with the Peppol status when known. The call is attributed to the company file.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.lookup.vat

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
vat requisstring
ex. BE0477472701
countrystring

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • validboolean | null
  • valid_formatboolean
  • vat_numberstring
  • enterprise_numberstring | null
  • namestring | null
  • address_linestring | null
  • statusstring | null
  • peppolobject | null
  • reasonstring | null
  • sourcestring
Exemple
{
    "valid": true,
    "valid_format": true,
    "vat_number": "BE0477472701",
    "enterprise_number": "0477472701",
    "name": "Le Comptoir Montois SRL",
    "address_line": "string",
    "status": "active",
    "peppol": {},
    "reason": "string",
    "source": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/vat?vat=BE0477472701" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/vat', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'vat' => 'BE0477472701',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/vat?vat=BE0477472701", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/vat",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "vat": "BE0477472701"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/lookup/citiesCity autocompletion read Hors démo 120 / 1 min

The call is attributed to the company file.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.lookup.cities

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
q requisstring
ex. Mons
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • dataobject[]
    Propriétés
    • postal_codestring
      ex. 7000
    • citystring
      ex. Mons
    • city_frstring | null
    • city_nlstring | null
      ex. Bergen
    • countrystring
      ex. BE
Exemple
{
    "data": [
        {
            "postal_code": "7000",
            "city": "Mons",
            "city_fr": "string",
            "city_nl": "Bergen",
            "country": "BE"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/cities?q=Mons" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/cities', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'q' => 'Mons',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/cities?q=Mons", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/cities",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "q": "Mons"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/lookup/streetsStreet autocompletion read Hors démo 120 / 1 min

The call is attributed to the company file.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.lookup.streets

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
zipcode requisstringFour digits.
ex. 7000
qstring
ex. Grand
countrystring
ex. BE

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • dataobject[]
    Propriétés
    • streetstring
      ex. Grand-Place
    • street_frstring | null
    • street_nlstring | null
    • postal_codestring
    • citystring
    • countrystring
Exemple
{
    "data": [
        {
            "street": "Grand-Place",
            "street_fr": "string",
            "street_nl": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/streets?zipcode=7000" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/streets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'zipcode' => '7000',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/streets?zipcode=7000", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/lookup/streets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "zipcode": "7000"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Chart of accounts

Accounts of a company file.

GET/v1/companies/{company}/accountsChart of accounts read

Integration tokens need the read ability.

Identifiant d'opération companies.accounts.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
qstringNumber prefix or part of the label.
ex. 6120
postablebooleanOnly the accounts entries can be posted to.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Account[]

Tableau de Account

Exemple
[
    {
        "id": 580,
        "company_id": 7,
        "number": "702000",
        "label": "Prestations de services",
        "type": "asset",
        "is_postable": true,
        "is_reconcilable": true,
        "purchase_grid": 82,
        "default_vat_code_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "default_vat_code": {}
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/accountsCreate an account write

Integration tokens need the write ability.

Identifiant d'opération companies.accounts.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • numberstringrequis
    2 to 12 digits, unique in the file.
  • typestringrequis
    asset liability expense income off_balance
  • labelstringrequis
    200 characters max.
  • is_postableboolean
  • is_reconcilableboolean
  • purchase_gridinteger | null
    81, 82 or 83.
  • default_vat_code_idinteger | null
Exemple
{
    "number": "612100",
    "label": "Électricité",
    "type": "expense",
    "is_postable": true,
    "purchase_grid": 82
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Account

Exemple
{
    "id": 580,
    "company_id": 7,
    "number": "702000",
    "label": "Prestations de services",
    "type": "asset",
    "is_postable": true,
    "is_reconcilable": true,
    "purchase_grid": 82,
    "default_vat_code_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "number": "612100",
    "label": "Électricité",
    "type": "expense",
    "is_postable": true,
    "purchase_grid": 82
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'number' => '612100',
        'label' => 'Électricité',
        'type' => 'expense',
        'is_postable' => true,
        'purchase_grid' => 82,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "number": "612100",
      "label": "Électricité",
      "type": "expense",
      "is_postable": true,
      "purchase_grid": 82
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "number": "612100",
        "label": "Électricité",
        "type": "expense",
        "is_postable": True,
        "purchase_grid": 82
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/accounts/{account}Update an account write

The number and the type of an account never change.

Integration tokens need the write ability.

Identifiant d'opération companies.accounts.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
account requisintegerId of the account (not its number).
ex. 223

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • labelstring
    200 characters max.
  • is_postableboolean
  • is_reconcilableboolean
  • purchase_gridinteger | null
    81, 82 or 83.
  • default_vat_code_idinteger | null
Exemple
{
    "label": "Électricité et gaz"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Account

Exemple
{
    "id": 580,
    "company_id": 7,
    "number": "702000",
    "label": "Prestations de services",
    "type": "asset",
    "is_postable": true,
    "is_reconcilable": true,
    "purchase_grid": 82,
    "default_vat_code_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/223" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "label": "Électricité et gaz"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/223', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'label' => 'Électricité et gaz',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/223", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "label": "Électricité et gaz"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/223",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "label": "Électricité et gaz"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Journals

Journals, routing rules of the imported documents, numbering series.

GET/v1/companies/{company}/journalsJournals read

With their control account, routing rules and number of entries.

Integration tokens need the read ability.

Identifiant d'opération companies.journals.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Journal[]

Tableau de Journal

Exemple
[
    {
        "id": 3,
        "company_id": 7,
        "code": "VEN",
        "label": "Ventes",
        "type": "purchase",
        "control_account_id": 42,
        "iban": "BE68539007547034",
        "bic": "GEBABEBB",
        "last_number": 412,
        "is_active": true,
        "is_default": true,
        "description": "Description",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "entries_count": 412,
        "control_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "rules": [
            {
                "id": 4,
                "company_id": 7,
                "journal_id": 3,
                "direction": "sale",
                "match_field": "payment_provider",
                "match_value": "TK",
                "priority": 100,
                "is_active": true,
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "deleted_at": "2026-03-15T09:41:00+00:00",
                "deleted_by": 1,
                "journal": {
                    "id": 3,
                    "code": "VEN",
                    "label": "Ventes",
                    "type": "sale"
                }
            }
        ]
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/journalsCreate a journal write

Integration tokens need the write ability.

Identifiant d'opération companies.journals.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • codestringrequis
    Letters and digits, 6 max, unique.
  • labelstringrequis
  • typestringrequis
    purchase sale purchase_credit_note sale_credit_note financial miscellaneous
  • control_account_idinteger | null
  • ibanstring | null
  • bicstring | null
Exemple
{
    "code": "ING",
    "label": "ING Business",
    "type": "financial",
    "iban": "BE12310123456789"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Journal

Exemple
{
    "id": 3,
    "company_id": 7,
    "code": "VEN",
    "label": "Ventes",
    "type": "purchase",
    "control_account_id": 42,
    "iban": "BE68539007547034",
    "bic": "GEBABEBB",
    "last_number": 412,
    "is_active": true,
    "is_default": true,
    "description": "Description",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "entries_count": 412,
    "control_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "rules": [
        {
            "id": 4,
            "company_id": 7,
            "journal_id": 3,
            "direction": "sale",
            "match_field": "payment_provider",
            "match_value": "TK",
            "priority": 100,
            "is_active": true,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "journal": {
                "id": 3,
                "code": "VEN",
                "label": "Ventes",
                "type": "sale"
            }
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "code": "ING",
    "label": "ING Business",
    "type": "financial",
    "iban": "BE12310123456789"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'code' => 'ING',
        'label' => 'ING Business',
        'type' => 'financial',
        'iban' => 'BE12310123456789',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "code": "ING",
      "label": "ING Business",
      "type": "financial",
      "iban": "BE12310123456789"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "code": "ING",
        "label": "ING Business",
        "type": "financial",
        "iban": "BE12310123456789"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/journals/{journal}Update a journal write

is_default makes it the default journal of its type.

Integration tokens need the write ability.

Identifiant d'opération companies.journals.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journal requisintegerId of the journal.
ex. 3

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • labelstring
  • descriptionstring | null
  • control_account_idinteger | null
  • ibanstring | null
  • is_activeboolean
  • is_defaultboolean
Exemple
{
    "is_default": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Journal

Exemple
{
    "id": 3,
    "company_id": 7,
    "code": "VEN",
    "label": "Ventes",
    "type": "purchase",
    "control_account_id": 42,
    "iban": "BE68539007547034",
    "bic": "GEBABEBB",
    "last_number": 412,
    "is_active": true,
    "is_default": true,
    "description": "Description",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "entries_count": 412,
    "control_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "rules": [
        {
            "id": 4,
            "company_id": 7,
            "journal_id": 3,
            "direction": "sale",
            "match_field": "payment_provider",
            "match_value": "TK",
            "priority": 100,
            "is_active": true,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "journal": {
                "id": 3,
                "code": "VEN",
                "label": "Ventes",
                "type": "sale"
            }
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_default": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_default' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_default": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_default": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/journals/{journal}Delete a journal write

Only a journal that never held an entry (continuous numbering); otherwise deactivate it. Goes to the recycle bin.

Integration tokens need the write ability.

Identifiant d'opération companies.journals.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journal requisintegerId of the journal.
ex. 3

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/journal-rulesJournal routing rules read

Integration tokens need the read ability.

Identifiant d'opération companies.journal-rules.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma JournalRule[]

Tableau de JournalRule

Exemple
[
    {
        "id": 4,
        "company_id": 7,
        "journal_id": 3,
        "direction": "sale",
        "match_field": "payment_provider",
        "match_value": "TK",
        "priority": 100,
        "is_active": true,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "journal": {
            "id": 3,
            "code": "VEN",
            "label": "Ventes",
            "type": "sale"
        }
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/journal-rulesCreate a journal rule write

Integration tokens need the write ability.

Identifiant d'opération companies.journal-rules.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • journal_idintegerrequis
  • directionstringrequis
    sale purchase
  • match_fieldstringrequis
    payment_provider number_series number_prefix third_party
  • match_valuestringrequis
    100 characters max.
  • priorityinteger
    1 to 999, lowest first.
  • is_activeboolean
Exemple
{
    "journal_id": 3,
    "direction": "sale",
    "match_field": "number_prefix",
    "match_value": "TK"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma JournalRule

Exemple
{
    "id": 4,
    "company_id": 7,
    "journal_id": 3,
    "direction": "sale",
    "match_field": "payment_provider",
    "match_value": "TK",
    "priority": 100,
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 3,
        "code": "VEN",
        "label": "Ventes",
        "type": "sale"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "journal_id": 3,
    "direction": "sale",
    "match_field": "number_prefix",
    "match_value": "TK"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'journal_id' => 3,
        'direction' => 'sale',
        'match_field' => 'number_prefix',
        'match_value' => 'TK',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "journal_id": 3,
      "direction": "sale",
      "match_field": "number_prefix",
      "match_value": "TK"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "journal_id": 3,
        "direction": "sale",
        "match_field": "number_prefix",
        "match_value": "TK"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/journal-rules/{journalRule}Update a journal rule write

Integration tokens need the write ability.

Identifiant d'opération companies.journal-rules.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journalRule requisintegerId of the journal rule.
ex. 4

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • journal_idinteger
  • directionstring
    sale purchase
  • match_fieldstring
    payment_provider number_series number_prefix third_party
  • match_valuestring
    100 characters max.
  • priorityinteger
    1 to 999, lowest first.
  • is_activeboolean
Exemple
{
    "priority": 10
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma JournalRule

Exemple
{
    "id": 4,
    "company_id": 7,
    "journal_id": 3,
    "direction": "sale",
    "match_field": "payment_provider",
    "match_value": "TK",
    "priority": 100,
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 3,
        "code": "VEN",
        "label": "Ventes",
        "type": "sale"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "priority": 10
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'priority' => 10,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "priority": 10
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "priority": 10
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/journal-rules/{journalRule}Delete a journal rule write

Integration tokens need the write ability.

Identifiant d'opération companies.journal-rules.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journalRule requisintegerId of the journal rule.
ex. 4

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journal-rules/4",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/documents/seriesNumbering series of the documents read

Series observed in the imported documents (prefix and payment provider) and the journal resolved for each.

Integration tokens need the read ability.

Identifiant d'opération companies.documents.series

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object[]

Tableau de

  • directionstring
    sale purchase
  • is_credit_noteboolean
  • number_seriesstring | null
    ex. TK
  • payment_providerstring | null
  • documentsinteger
    ex. 214
  • pendinginteger
    ex. 6
  • sample_numberstring | null
    ex. TK-2026-00214
  • journalobject | null
Exemple
[
    {
        "direction": "sale",
        "is_credit_note": true,
        "number_series": "TK",
        "payment_provider": "string",
        "documents": 214,
        "pending": 6,
        "sample_number": "TK-2026-00214",
        "journal": {}
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/series" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/series', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/series", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/series",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Fiscal years

Fiscal years, periods, locking, closing and year-end.

GET/v1/companies/{company}/fiscal-yearsFiscal years and periods read

Integration tokens need the read ability.

Identifiant d'opération companies.fiscal-years.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma FiscalYear[]

Tableau de FiscalYear

Exemple
[
    {
        "id": 2,
        "company_id": 7,
        "code": "2026",
        "starts_on": "2026-01-01T00:00:00.000000Z",
        "ends_on": "2026-12-31T00:00:00.000000Z",
        "is_closed": false,
        "closed_at": "2026-03-15T09:41:00+00:00",
        "closed_by": 1,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "periods": [
            {
                "id": 16,
                "fiscal_year_id": 2,
                "number": 3,
                "label": "Mars 2026",
                "starts_on": "2026-03-15T09:41:00+00:00",
                "ends_on": "2026-03-15T09:41:00+00:00",
                "is_locked": false,
                "locked_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3
            }
        ]
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fiscal-yearsOpen a fiscal year write

Creates the year and its periods (opening, one per month, closing).

Integration tokens need the write ability.

Identifiant d'opération companies.fiscal-years.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • codestringrequis
    Unique, 10 characters max.
  • starts_onstring <date>requis
  • ends_onstring <date>requis
Exemple
{
    "code": "2027",
    "starts_on": "2027-01-01",
    "ends_on": "2027-12-31"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma FiscalYear

Exemple
{
    "id": 2,
    "company_id": 7,
    "code": "2026",
    "starts_on": "2026-01-01T00:00:00.000000Z",
    "ends_on": "2026-12-31T00:00:00.000000Z",
    "is_closed": false,
    "closed_at": "2026-03-15T09:41:00+00:00",
    "closed_by": 1,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "periods": [
        {
            "id": 16,
            "fiscal_year_id": 2,
            "number": 3,
            "label": "Mars 2026",
            "starts_on": "2026-03-15T09:41:00+00:00",
            "ends_on": "2026-03-15T09:41:00+00:00",
            "is_locked": false,
            "locked_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "code": "2027",
    "starts_on": "2027-01-01",
    "ends_on": "2027-12-31"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'code' => '2027',
        'starts_on' => '2027-01-01',
        'ends_on' => '2027-12-31',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "code": "2027",
      "starts_on": "2027-01-01",
      "ends_on": "2027-12-31"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "code": "2027",
        "starts_on": "2027-01-01",
        "ends_on": "2027-12-31"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/fiscal-years/{fiscalYear}/periods/{period}Lock or unlock a period write

No entry can be posted in a locked period. Refused with period_locked (reason fiscal_year_closed) when the fiscal year is closed.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.fiscal-years.periods.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2
period requisintegerId of the period.
ex. 16

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • is_lockedbooleanrequis
Exemple
{
    "is_locked": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Period

Exemple
{
    "id": 16,
    "fiscal_year_id": 2,
    "number": 3,
    "label": "Mars 2026",
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "is_locked": false,
    "locked_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/periods/16" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_locked": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/periods/16', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_locked' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/periods/16", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_locked": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/periods/16",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_locked": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fiscal-years/{fiscalYear}/closeClose or reopen a fiscal year write

Locks every period. Send reopen: true to reopen. For the closing entries and the carry-forward use year-end.

Integration tokens need the write ability.

Identifiant d'opération companies.fiscal-years.close

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • reopenboolean
Exemple
{
    "reopen": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma FiscalYear

Exemple
{
    "id": 2,
    "company_id": 7,
    "code": "2026",
    "starts_on": "2026-01-01T00:00:00.000000Z",
    "ends_on": "2026-12-31T00:00:00.000000Z",
    "is_closed": false,
    "closed_at": "2026-03-15T09:41:00+00:00",
    "closed_by": 1,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "periods": [
        {
            "id": 16,
            "fiscal_year_id": 2,
            "number": 3,
            "label": "Mars 2026",
            "starts_on": "2026-03-15T09:41:00+00:00",
            "ends_on": "2026-03-15T09:41:00+00:00",
            "is_locked": false,
            "locked_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/close" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reopen": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/close', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reopen' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/close", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reopen": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/close",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reopen": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fiscal-years/{fiscalYear}/year-endYear-end closing write 5 / 1 min

Posts the closing entry (result), opens the next fiscal year when needed, posts the opening entry (carry-forward of the balance sheet accounts) and closes the year. Emits the webhook fiscal_year.closed.

Integration tokens need the write ability.

Rate limit: 5 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.fiscal-years.year-end

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "result": "18420.11",
    "closing_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    },
    "opening_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    },
    "fiscal_year": {
        "id": 2,
        "company_id": 7,
        "code": "2026",
        "starts_on": "2026-01-01T00:00:00.000000Z",
        "ends_on": "2026-12-31T00:00:00.000000Z",
        "is_closed": false,
        "closed_at": "2026-03-15T09:41:00+00:00",
        "closed_by": 1,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "periods": [
            {
                "id": 16,
                "fiscal_year_id": 2,
                "number": 3,
                "label": "Mars 2026",
                "starts_on": "2026-03-15T09:41:00+00:00",
                "ends_on": "2026-03-15T09:41:00+00:00",
                "is_locked": false,
                "locked_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3
            }
        ]
    },
    "next_fiscal_year": {
        "id": 2,
        "company_id": 7,
        "code": "2026",
        "starts_on": "2026-01-01T00:00:00.000000Z",
        "ends_on": "2026-12-31T00:00:00.000000Z",
        "is_closed": false,
        "closed_at": "2026-03-15T09:41:00+00:00",
        "closed_by": 1,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "periods": [
            {
                "id": 16,
                "fiscal_year_id": 2,
                "number": 3,
                "label": "Mars 2026",
                "starts_on": "2026-03-15T09:41:00+00:00",
                "ends_on": "2026-03-15T09:41:00+00:00",
                "is_locked": false,
                "locked_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3
            }
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/year-end" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/year-end', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/year-end", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/year-end",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Third parties

Customers and suppliers: sheet, open items, lettering, reminders, totals, VIES.

GET/v1/companies/{company}/third-partiesList the third parties read

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
typestring
customer supplier
qstringName, code or VAT number.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma ThirdParty[]

Tableau de ThirdParty

Exemple
[
    {
        "id": 18,
        "company_id": 7,
        "type": "customer",
        "code": "DUBUISSON",
        "name": "Brasserie Dubuisson SA",
        "contact_name": "string",
        "vat_number": "BE0402531376",
        "enterprise_number": "0402531376",
        "legal_form_code": "string",
        "vat_status": "subject",
        "country": "BE",
        "language": "fr",
        "category": "string",
        "currency": "EUR",
        "address": "Chaussée de Mons 28",
        "house_number": "14",
        "box": "string",
        "address_line_2": "string",
        "postal_code": "7904",
        "city": "Pipaix",
        "nace_code": "string",
        "iban": "BE71096123456769",
        "bic": "GKCCBEBB",
        "bank_account": "string",
        "email": "compta@dubuisson.example",
        "phone": "+32 65 31 42 18",
        "fax": "string",
        "website": "https://www.comptoir-montois.be",
        "payment_terms_days": 30,
        "form_281_50_type": "string",
        "profession_281_50": "string",
        "is_natural_person": false,
        "notes": "string",
        "default_vat_code_id": 42,
        "default_account_id": 42,
        "vies_valid": true,
        "vies_checked_at": "2026-03-15T09:41:00+00:00",
        "vies_name": "string",
        "peppol_identifier": "0208:0402531376",
        "peppol_registered": true,
        "peppol_access_point": {},
        "peppol_document_types": [
            {
                "id": "bis_billing_invoice",
                "name": "Invoice BIS Billing 3.0",
                "family": "billing",
                "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
                "document_id": "string"
            }
        ],
        "peppol_checked_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "default_account": {},
        "default_vat_code": {}
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-partiesCreate a third party write

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • typestringrequis
    customer supplier
  • codestring | null
    Unique per type; generated from the name when absent.
  • namestringrequis
  • contact_namestring | null
  • vat_numberstring | null
    Validated per country.
  • enterprise_numberstring | null
  • legal_form_codestring | null
  • house_numberstring | null
  • boxstring | null
  • nace_codestring | null
  • vat_statusstring
    subject not_subject exempt intra_eu non_eu
  • countrystring | null
    ISO 3166-1 alpha-2, BE by default.
  • languagestring
    fr nl en de
  • categorystring | null
  • currencystring
    ISO 4217.
  • addressstring | null
  • address_line_2string | null
  • postal_codestring | null
  • citystring | null
  • ibanstring | null
  • bicstring | null
  • bank_accountstring | null
  • emailstring <email> | null
  • phonestring | null
  • faxstring | null
  • websitestring | null
  • payment_terms_daysinteger
    0 to 365.
  • form_281_50_typestring | null
  • profession_281_50string | null
  • is_natural_personboolean
  • notesstring | null
  • default_vat_code_idinteger | null
  • default_account_idinteger | null
Exemple
{
    "type": "supplier",
    "name": "Brasserie Dubuisson SA",
    "vat_number": "BE 0402.531.376",
    "address": "Chaussée de Mons 28",
    "postal_code": "7904",
    "city": "Pipaix",
    "iban": "BE71 0961 2345 6769",
    "payment_terms_days": 30
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma ThirdParty

Exemple
{
    "id": 18,
    "company_id": 7,
    "type": "customer",
    "code": "DUBUISSON",
    "name": "Brasserie Dubuisson SA",
    "contact_name": "string",
    "vat_number": "BE0402531376",
    "enterprise_number": "0402531376",
    "legal_form_code": "string",
    "vat_status": "subject",
    "country": "BE",
    "language": "fr",
    "category": "string",
    "currency": "EUR",
    "address": "Chaussée de Mons 28",
    "house_number": "14",
    "box": "string",
    "address_line_2": "string",
    "postal_code": "7904",
    "city": "Pipaix",
    "nace_code": "string",
    "iban": "BE71096123456769",
    "bic": "GKCCBEBB",
    "bank_account": "string",
    "email": "compta@dubuisson.example",
    "phone": "+32 65 31 42 18",
    "fax": "string",
    "website": "https://www.comptoir-montois.be",
    "payment_terms_days": 30,
    "form_281_50_type": "string",
    "profession_281_50": "string",
    "is_natural_person": false,
    "notes": "string",
    "default_vat_code_id": 42,
    "default_account_id": 42,
    "vies_valid": true,
    "vies_checked_at": "2026-03-15T09:41:00+00:00",
    "vies_name": "string",
    "peppol_identifier": "0208:0402531376",
    "peppol_registered": true,
    "peppol_access_point": {},
    "peppol_document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "peppol_checked_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_account": {},
    "default_vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "type": "supplier",
    "name": "Brasserie Dubuisson SA",
    "vat_number": "BE 0402.531.376",
    "address": "Chaussée de Mons 28",
    "postal_code": "7904",
    "city": "Pipaix",
    "iban": "BE71 0961 2345 6769",
    "payment_terms_days": 30
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'type' => 'supplier',
        'name' => 'Brasserie Dubuisson SA',
        'vat_number' => 'BE 0402.531.376',
        'address' => 'Chaussée de Mons 28',
        'postal_code' => '7904',
        'city' => 'Pipaix',
        'iban' => 'BE71 0961 2345 6769',
        'payment_terms_days' => 30,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "type": "supplier",
      "name": "Brasserie Dubuisson SA",
      "vat_number": "BE 0402.531.376",
      "address": "Chaussée de Mons 28",
      "postal_code": "7904",
      "city": "Pipaix",
      "iban": "BE71 0961 2345 6769",
      "payment_terms_days": 30
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "type": "supplier",
        "name": "Brasserie Dubuisson SA",
        "vat_number": "BE 0402.531.376",
        "address": "Chaussée de Mons 28",
        "postal_code": "7904",
        "city": "Pipaix",
        "iban": "BE71 0961 2345 6769",
        "payment_terms_days": 30
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}Third party sheet read

With its default account and VAT code.

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma ThirdParty

Exemple
{
    "id": 18,
    "company_id": 7,
    "type": "customer",
    "code": "DUBUISSON",
    "name": "Brasserie Dubuisson SA",
    "contact_name": "string",
    "vat_number": "BE0402531376",
    "enterprise_number": "0402531376",
    "legal_form_code": "string",
    "vat_status": "subject",
    "country": "BE",
    "language": "fr",
    "category": "string",
    "currency": "EUR",
    "address": "Chaussée de Mons 28",
    "house_number": "14",
    "box": "string",
    "address_line_2": "string",
    "postal_code": "7904",
    "city": "Pipaix",
    "nace_code": "string",
    "iban": "BE71096123456769",
    "bic": "GKCCBEBB",
    "bank_account": "string",
    "email": "compta@dubuisson.example",
    "phone": "+32 65 31 42 18",
    "fax": "string",
    "website": "https://www.comptoir-montois.be",
    "payment_terms_days": 30,
    "form_281_50_type": "string",
    "profession_281_50": "string",
    "is_natural_person": false,
    "notes": "string",
    "default_vat_code_id": 42,
    "default_account_id": 42,
    "vies_valid": true,
    "vies_checked_at": "2026-03-15T09:41:00+00:00",
    "vies_name": "string",
    "peppol_identifier": "0208:0402531376",
    "peppol_registered": true,
    "peppol_access_point": {},
    "peppol_document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "peppol_checked_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_account": {},
    "default_vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/third-parties/{thirdParty}Update a third party write

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • codestring | null
    Unique per type; generated from the name when absent.
  • namestring
  • contact_namestring | null
  • vat_numberstring | null
    Validated per country.
  • enterprise_numberstring | null
  • legal_form_codestring | null
  • house_numberstring | null
  • boxstring | null
  • nace_codestring | null
  • vat_statusstring
    subject not_subject exempt intra_eu non_eu
  • countrystring | null
    ISO 3166-1 alpha-2, BE by default.
  • languagestring
    fr nl en de
  • categorystring | null
  • currencystring
    ISO 4217.
  • addressstring | null
  • address_line_2string | null
  • postal_codestring | null
  • citystring | null
  • ibanstring | null
  • bicstring | null
  • bank_accountstring | null
  • emailstring <email> | null
  • phonestring | null
  • faxstring | null
  • websitestring | null
  • payment_terms_daysinteger
    0 to 365.
  • form_281_50_typestring | null
  • profession_281_50string | null
  • is_natural_personboolean
  • notesstring | null
  • default_vat_code_idinteger | null
  • default_account_idinteger | null
Exemple
{
    "payment_terms_days": 45,
    "email": "compta@dubuisson.example"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma ThirdParty

Exemple
{
    "id": 18,
    "company_id": 7,
    "type": "customer",
    "code": "DUBUISSON",
    "name": "Brasserie Dubuisson SA",
    "contact_name": "string",
    "vat_number": "BE0402531376",
    "enterprise_number": "0402531376",
    "legal_form_code": "string",
    "vat_status": "subject",
    "country": "BE",
    "language": "fr",
    "category": "string",
    "currency": "EUR",
    "address": "Chaussée de Mons 28",
    "house_number": "14",
    "box": "string",
    "address_line_2": "string",
    "postal_code": "7904",
    "city": "Pipaix",
    "nace_code": "string",
    "iban": "BE71096123456769",
    "bic": "GKCCBEBB",
    "bank_account": "string",
    "email": "compta@dubuisson.example",
    "phone": "+32 65 31 42 18",
    "fax": "string",
    "website": "https://www.comptoir-montois.be",
    "payment_terms_days": 30,
    "form_281_50_type": "string",
    "profession_281_50": "string",
    "is_natural_person": false,
    "notes": "string",
    "default_vat_code_id": 42,
    "default_account_id": 42,
    "vies_valid": true,
    "vies_checked_at": "2026-03-15T09:41:00+00:00",
    "vies_name": "string",
    "peppol_identifier": "0208:0402531376",
    "peppol_registered": true,
    "peppol_access_point": {},
    "peppol_document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "peppol_checked_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_account": {},
    "default_vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "payment_terms_days": 45,
    "email": "compta@dubuisson.example"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'payment_terms_days' => 45,
        'email' => 'compta@dubuisson.example',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "payment_terms_days": 45,
      "email": "compta@dubuisson.example"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "payment_terms_days": 45,
        "email": "compta@dubuisson.example"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/third-parties/{thirdParty}Delete a third party write

Refused (422) when an entry or a document references it. Goes to the recycle bin.

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}/entriesOpen items and entries of a third party read

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.entries

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Paramètres de requête

NomTypeDescription
letteredstring
all yes no
fiscal_year_idinteger

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • rowsobject[]
    Propriétés
    • line_idinteger
      ex. 3391
    • entry_idinteger
      ex. 1284
    • journal_codestring
      ex. VEN
    • entry_numberinteger
      ex. 412
    • document_numberstring | null
      ex. 2026/0412
    • period_numberinteger
      ex. 3
    • entry_datestring <date>
    • due_datestring <date> | null
    • amountstring <decimal>
      ex. 1210.00
    • debitstring <decimal>
      ex. 1210.00
    • creditstring <decimal>
      ex. 0.00
    • reconciliation_codestring | null
    • labelstring | null
    • reminder_levelinteger
      ex. 0
    • reminder_sent_atstring <date-time> | null
    • is_letteredboolean
      ex. false
  • summaryobject
    Propriétés
    • balancestring <decimal>
      ex. 1210.00
    • open_countinteger
      ex. 1
    • lettered_countinteger
      ex. 0
Exemple
{
    "rows": [
        {
            "line_id": 3391,
            "entry_id": 1284,
            "journal_code": "VEN",
            "entry_number": 412,
            "document_number": "2026/0412",
            "period_number": 3,
            "entry_date": "2026-03-15",
            "due_date": "2026-03-15",
            "amount": "1210.00",
            "debit": "1210.00",
            "credit": "0.00",
            "reconciliation_code": "string",
            "label": "Facture Brasserie Dubuisson",
            "reminder_level": 0,
            "reminder_sent_at": "2026-03-15T09:41:00+00:00",
            "is_lettered": false
        }
    ],
    "summary": {
        "balance": "1210.00",
        "open_count": 1,
        "lettered_count": 0
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/letterLetter lines together write

Matches lines of the third party whose debits and credits balance (a small difference is posted to the difference accounts of the settings).

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.letter

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • line_idsinteger[]requis
Exemple
{
    "line_ids": [
        3391,
        3518
    ]
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • codestring
    Lettering code given.
    ex. AB
  • line_idsinteger[]
Exemple
{
    "code": "AB",
    "line_ids": [
        1
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "line_ids": [
        3391,
        3518
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'line_ids' => [
            3391,
            3518,
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "line_ids": [
          3391,
          3518
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "line_ids": [
            3391,
            3518
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/unletterRemove a lettering write

By lettering code or by lines.

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.unletter

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • codestring | null
  • line_idsinteger[]
Exemple
{
    "code": "AB"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • codesstring[]
  • line_idsinteger[]
Exemple
{
    "codes": [
        "AB"
    ],
    "line_ids": [
        1
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/unletter" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "code": "AB"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/unletter', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'code' => 'AB',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/unletter", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "code": "AB"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/unletter",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "code": "AB"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/letter-autoAutomatic lettering write

Letters every group of open lines that balances exactly.

Integration tokens need the write ability.

Identifiant d'opération companies.third-parties.letter-auto

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • groupsinteger
    ex. 3
  • line_idsinteger[]
Exemple
{
    "groups": 3,
    "line_ids": [
        1
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter-auto" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter-auto', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter-auto", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/letter-auto",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/entries/{line}/remindRecord a payment reminder write Hors démo

Raises the reminder level of an open line and stamps the date. No e-mail is sent by this endpoint.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération companies.third-parties.remind

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18
line requisintegerId of the line.
ex. 3391

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object

The row, as in the entries list.

Exemple
{}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries/3391/remind" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries/3391/remind', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries/3391/remind", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/entries/3391/remind",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}/remindersReminders of a third party read

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.reminders

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object[]

Tableau de object

Exemple
[
    {}
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/reminders" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/reminders', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/reminders", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/reminders",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}/totalsTotals per period read

Integration tokens need the read ability.

Identifiant d'opération companies.third-parties.totals

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Paramètres de requête

NomTypeDescription
modestring
balance debit credit
fiscal_year_idinteger

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearobject
    Propriétés
    • idinteger
    • codestring
      ex. 2026
  • modestring
    ex. balance
  • rowsobject[]
    Propriétés
    • period_numberinteger
      ex. 1
    • period_labelstring
      ex. Janvier 2026
    • amountstring <decimal>
  • totalstring <decimal>
Exemple
{
    "fiscal_year": {
        "id": 42,
        "code": "2026"
    },
    "mode": "balance",
    "rows": [
        {
            "period_number": 1,
            "period_label": "Janvier 2026",
            "amount": "1210.00"
        }
    ],
    "total": "1210.00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/totals" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/totals', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/totals", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/totals",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/viesCheck a VAT number with VIES read Hors démo 30 / 1 min

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.vies.check

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
vat_number requisstring
ex. BE0402531376

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • validboolean | null
    Null when VIES did not answer.
  • namestring | null
    ex. BRASSERIE DUBUISSON
  • addressstring | null
  • countrystring
    ex. BE
  • numberstring
    ex. 0402531376
  • errorstring | null
    invalid_format, service_unavailable or the VIES user error.
Exemple
{
    "valid": true,
    "name": "BRASSERIE DUBUISSON",
    "address": "Grand-Place 14",
    "country": "BE",
    "number": "0402531376",
    "error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vies?vat_number=BE0402531376" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vies', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'vat_number' => 'BE0402531376',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vies?vat_number=BE0402531376", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vies",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "vat_number": "BE0402531376"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/{thirdParty}/viesCheck the VAT number of a third party with VIES write Hors démo 30 / 1 min

Stores the result on the third party (vies_valid, vies_checked_at, vies_name).

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.third-parties.vies

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • validboolean | null
    Null when VIES did not answer.
  • namestring | null
    ex. BRASSERIE DUBUISSON
  • addressstring | null
  • countrystring
    ex. BE
  • numberstring
    ex. 0402531376
  • errorstring | null
    invalid_format, service_unavailable or the VIES user error.
  • third_partyThirdParty
Exemple
{
    "valid": true,
    "name": "BRASSERIE DUBUISSON",
    "address": "Grand-Place 14",
    "country": "BE",
    "number": "0402531376",
    "error": "string",
    "third_party": {
        "id": 18,
        "company_id": 7,
        "type": "customer",
        "code": "DUBUISSON",
        "name": "Brasserie Dubuisson SA",
        "contact_name": "string",
        "vat_number": "BE0402531376",
        "enterprise_number": "0402531376",
        "legal_form_code": "string",
        "vat_status": "subject",
        "country": "BE",
        "language": "fr",
        "category": "string",
        "currency": "EUR",
        "address": "Chaussée de Mons 28",
        "house_number": "14",
        "box": "string",
        "address_line_2": "string",
        "postal_code": "7904",
        "city": "Pipaix",
        "nace_code": "string",
        "iban": "BE71096123456769",
        "bic": "GKCCBEBB",
        "bank_account": "string",
        "email": "compta@dubuisson.example",
        "phone": "+32 65 31 42 18",
        "fax": "string",
        "website": "https://www.comptoir-montois.be",
        "payment_terms_days": 30,
        "form_281_50_type": "string",
        "profession_281_50": "string",
        "is_natural_person": false,
        "notes": "string",
        "default_vat_code_id": 42,
        "default_account_id": 42,
        "vies_valid": true,
        "vies_checked_at": "2026-03-15T09:41:00+00:00",
        "vies_name": "string",
        "peppol_identifier": "0208:0402531376",
        "peppol_registered": true,
        "peppol_access_point": {},
        "peppol_document_types": [
            {
                "id": "bis_billing_invoice",
                "name": "Invoice BIS Billing 3.0",
                "family": "billing",
                "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
                "document_id": "string"
            }
        ],
        "peppol_checked_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "default_account": {},
        "default_vat_code": {}
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/vies" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/vies', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/vies", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/vies",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Entries

Journal entries: free entries, invoices and credit notes, reversal.

GET/v1/companies/{company}/entriesList the entries read

Newest first, with their journal, third party and lines.

Integration tokens need the read ability.

Identifiant d'opération companies.entries.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
journal_idinteger
fiscal_year_idinteger
third_party_idinteger
fromstring <date>Entry date, inclusive.
tostring <date>Entry date, inclusive.
statusstring
posted reversed
qstringLabel, reference, structured communication, third party name, line label or account number prefix.
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 1284,
            "company_id": 7,
            "fiscal_year_id": 2,
            "period_id": 16,
            "journal_id": 3,
            "number": 412,
            "entry_date": "2026-03-15T00:00:00.000000Z",
            "due_date": "2026-03-15T09:41:00+00:00",
            "label": "Facture Brasserie Dubuisson SA",
            "reference": "F-2026-0412",
            "structured_communication": "000000000101",
            "third_party_id": 18,
            "status": "posted",
            "origin": "manual",
            "created_by": 1,
            "posted_at": "2026-03-15T09:41:00+00:00",
            "reversed_entry_id": 42,
            "reversed_by_entry_id": 42,
            "recurring_entry_id": 42,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "journal": {
                "id": 3,
                "code": "VEN",
                "type": "sale"
            },
            "third_party": {
                "id": 18,
                "name": "Brasserie Dubuisson SA"
            },
            "lines": [
                {}
            ]
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/entriesPost a free entry write

Miscellaneous operation, financial entry…: every line is given, debits must equal credits. The entry is posted at once and numbered in its journal. Accounts are addressed by account_id or by number (account). A date in a locked period or a closed fiscal year is refused with 422 period_locked.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.entries.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • journal_idintegerrequis
  • entry_datestring <date>requis
    Inside an open fiscal year and an unlocked period.
  • due_datestring <date> | null
  • labelstringrequis
    200 characters max.
  • referencestring | null
    60 characters max.
  • structured_communicationstring | null
    Belgian structured communication.
  • third_party_idinteger | null
  • linesobject[]requis
    Propriétés
    • account_idinteger
      Required without account.
    • accountstring
      Account number; required without account_id.
    • debitstring | null
      Decimal, positive.
    • creditstring | null
      Decimal, positive.
    • labelstring | null
    • third_party_idinteger | null
    • vat_code_idinteger | null
    • vat_basestring | null
      Taxable base carried by the line.
    • cost_center_idinteger | null
      Analytic code of the cost_center axis.
    • project_idinteger | null
      Analytic code of the project axis.
Exemple
{
    "journal_id": 5,
    "entry_date": "2026-03-31",
    "label": "Salaires mars 2026",
    "reference": "SAL-2026-03",
    "lines": [
        {
            "account": "620200",
            "debit": "8420.00",
            "label": "Rémunérations brutes"
        },
        {
            "account": "453000",
            "credit": "2105.00",
            "label": "Précompte professionnel"
        },
        {
            "account": "454000",
            "credit": "1100.48",
            "label": "ONSS"
        },
        {
            "account": "455000",
            "credit": "5214.52",
            "label": "Net à payer"
        }
    ]
}

Réponses

201Entry posted

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma JournalEntry

Exemple
{
    "id": 1284,
    "company_id": 7,
    "fiscal_year_id": 2,
    "period_id": 16,
    "journal_id": 3,
    "number": 412,
    "entry_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "label": "Facture Brasserie Dubuisson SA",
    "reference": "F-2026-0412",
    "structured_communication": "000000000101",
    "third_party_id": 18,
    "status": "posted",
    "origin": "manual",
    "created_by": 1,
    "posted_at": "2026-03-15T09:41:00+00:00",
    "reversed_entry_id": 42,
    "reversed_by_entry_id": 42,
    "recurring_entry_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {
        "id": 3,
        "code": "VEN",
        "type": "sale"
    },
    "third_party": {
        "id": 18,
        "name": "Brasserie Dubuisson SA"
    },
    "lines": [
        {
            "id": 3391,
            "journal_entry_id": 1284,
            "position": 1,
            "account_id": 580,
            "third_party_id": 18,
            "label": "Brasserie Dubuisson SA",
            "debit": "0.00",
            "credit": "1000.00",
            "vat_code_id": 4,
            "vat_base": "1000.00",
            "reconciliation_code": "AB",
            "cost_center_id": 42,
            "project_id": 42,
            "reminder_level": 0,
            "reminder_sent_at": "2026-03-15T09:41:00+00:00",
            "account": {
                "id": 580,
                "number": "702000",
                "label": "Prestations de services"
            },
            "vat_code": {}
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "journal_id": 5,
    "entry_date": "2026-03-31",
    "label": "Salaires mars 2026",
    "reference": "SAL-2026-03",
    "lines": [
        {
            "account": "620200",
            "debit": "8420.00",
            "label": "Rémunérations brutes"
        },
        {
            "account": "453000",
            "credit": "2105.00",
            "label": "Précompte professionnel"
        },
        {
            "account": "454000",
            "credit": "1100.48",
            "label": "ONSS"
        },
        {
            "account": "455000",
            "credit": "5214.52",
            "label": "Net à payer"
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'journal_id' => 5,
        'entry_date' => '2026-03-31',
        'label' => 'Salaires mars 2026',
        'reference' => 'SAL-2026-03',
        'lines' => [
            [
                'account' => '620200',
                'debit' => '8420.00',
                'label' => 'Rémunérations brutes',
            ],
            [
                'account' => '453000',
                'credit' => '2105.00',
                'label' => 'Précompte professionnel',
            ],
            [
                'account' => '454000',
                'credit' => '1100.48',
                'label' => 'ONSS',
            ],
            [
                'account' => '455000',
                'credit' => '5214.52',
                'label' => 'Net à payer',
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "journal_id": 5,
      "entry_date": "2026-03-31",
      "label": "Salaires mars 2026",
      "reference": "SAL-2026-03",
      "lines": [
          {
              "account": "620200",
              "debit": "8420.00",
              "label": "Rémunérations brutes"
          },
          {
              "account": "453000",
              "credit": "2105.00",
              "label": "Précompte professionnel"
          },
          {
              "account": "454000",
              "credit": "1100.48",
              "label": "ONSS"
          },
          {
              "account": "455000",
              "credit": "5214.52",
              "label": "Net à payer"
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "journal_id": 5,
        "entry_date": "2026-03-31",
        "label": "Salaires mars 2026",
        "reference": "SAL-2026-03",
        "lines": [
            {
                "account": "620200",
                "debit": "8420.00",
                "label": "Rémunérations brutes"
            },
            {
                "account": "453000",
                "credit": "2105.00",
                "label": "Précompte professionnel"
            },
            {
                "account": "454000",
                "credit": "1100.48",
                "label": "ONSS"
            },
            {
                "account": "455000",
                "credit": "5214.52",
                "label": "Net à payer"
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/entries/invoicePost an invoice or a credit note write

Purchase or sale invoice (journal of type purchase / sale) or credit note (journal of type purchase_credit_note / sale_credit_note). Send the net lines with their VAT code: the VAT lines and the third party line are generated, including reverse charge (intra-EU, co-contractor). The label defaults to « Facture <third party> ». A date in a locked period or a closed fiscal year is refused with 422 period_locked.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.entries.invoice

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • journal_idintegerrequis
    Journal of a purchase or sale type.
  • third_party_idintegerrequis
  • entry_datestring <date>requis
  • due_datestring <date> | null
  • labelstring | null
  • referencestring | null
    Invoice number.
  • structured_communicationstring | null
  • linesobject[]requis
    Propriétés
    • account_idinteger
      Required without account.
    • accountstring
      Account number.
    • amountstringrequis
      Net amount (excl. VAT), decimal.
    • vat_code_idinteger | null
    • vat_codestring | null
      Code of the VAT code (V21, A06, AIC21…).
    • labelstring | null
    • cost_center_idinteger | null
      Analytic code of the cost_center axis.
    • project_idinteger | null
      Analytic code of the project axis.
Exemple
{
    "journal_id": 1,
    "third_party_id": 18,
    "entry_date": "2026-03-15",
    "due_date": "2026-04-14",
    "reference": "F-2026-0412",
    "lines": [
        {
            "account": "604000",
            "amount": "507.00",
            "vat_code": "A21",
            "label": "Fûts Bush Caractère 20 L"
        },
        {
            "account": "613200",
            "amount": "35.00",
            "vat_code": "A21",
            "label": "Consigne et transport"
        }
    ]
}

Réponses

201Invoice posted

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma JournalEntry

Exemple
{
    "id": 1284,
    "company_id": 7,
    "fiscal_year_id": 2,
    "period_id": 16,
    "journal_id": 1,
    "number": 412,
    "entry_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-04-14T00:00:00.000000Z",
    "label": "Facture Brasserie Dubuisson SA",
    "reference": "F-2026-0412",
    "structured_communication": null,
    "third_party_id": 18,
    "status": "posted",
    "origin": "manual",
    "created_by": 12,
    "posted_at": "2026-03-16T08:12:40.000000Z",
    "reversed_entry_id": null,
    "reversed_by_entry_id": null,
    "recurring_entry_id": null,
    "created_at": "2026-03-16T08:12:40.000000Z",
    "updated_at": "2026-03-16T08:12:40.000000Z",
    "lock_version": 1,
    "version": 1,
    "lines": [
        {
            "id": 3391,
            "journal_entry_id": 1284,
            "position": 1,
            "account_id": 361,
            "third_party_id": null,
            "label": "Fûts Bush Caractère 20 L",
            "debit": "507.00",
            "credit": "0.00",
            "vat_code_id": 25,
            "vat_base": "507.00",
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 361,
                "number": "604000",
                "label": "Achats de marchandises"
            }
        },
        {
            "id": 3392,
            "journal_entry_id": 1284,
            "position": 2,
            "account_id": 384,
            "third_party_id": null,
            "label": "Consigne et transport",
            "debit": "35.00",
            "credit": "0.00",
            "vat_code_id": 25,
            "vat_base": "35.00",
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 384,
                "number": "613200",
                "label": "Transports et déplacements"
            }
        },
        {
            "id": 3393,
            "journal_entry_id": 1284,
            "position": 3,
            "account_id": 234,
            "third_party_id": null,
            "label": "TVA déductible",
            "debit": "113.82",
            "credit": "0.00",
            "vat_code_id": null,
            "vat_base": null,
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 234,
                "number": "411100",
                "label": "TVA déductible sur achats"
            }
        },
        {
            "id": 3394,
            "journal_entry_id": 1284,
            "position": 4,
            "account_id": 263,
            "third_party_id": 18,
            "label": "Brasserie Dubuisson SA",
            "debit": "0.00",
            "credit": "655.82",
            "vat_code_id": null,
            "vat_base": null,
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 263,
                "number": "440000",
                "label": "Fournisseurs"
            }
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/invoice" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "journal_id": 1,
    "third_party_id": 18,
    "entry_date": "2026-03-15",
    "due_date": "2026-04-14",
    "reference": "F-2026-0412",
    "lines": [
        {
            "account": "604000",
            "amount": "507.00",
            "vat_code": "A21",
            "label": "Fûts Bush Caractère 20 L"
        },
        {
            "account": "613200",
            "amount": "35.00",
            "vat_code": "A21",
            "label": "Consigne et transport"
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/invoice', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'journal_id' => 1,
        'third_party_id' => 18,
        'entry_date' => '2026-03-15',
        'due_date' => '2026-04-14',
        'reference' => 'F-2026-0412',
        'lines' => [
            [
                'account' => '604000',
                'amount' => '507.00',
                'vat_code' => 'A21',
                'label' => 'Fûts Bush Caractère 20 L',
            ],
            [
                'account' => '613200',
                'amount' => '35.00',
                'vat_code' => 'A21',
                'label' => 'Consigne et transport',
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/invoice", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "journal_id": 1,
      "third_party_id": 18,
      "entry_date": "2026-03-15",
      "due_date": "2026-04-14",
      "reference": "F-2026-0412",
      "lines": [
          {
              "account": "604000",
              "amount": "507.00",
              "vat_code": "A21",
              "label": "Fûts Bush Caractère 20 L"
          },
          {
              "account": "613200",
              "amount": "35.00",
              "vat_code": "A21",
              "label": "Consigne et transport"
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/invoice",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "journal_id": 1,
        "third_party_id": 18,
        "entry_date": "2026-03-15",
        "due_date": "2026-04-14",
        "reference": "F-2026-0412",
        "lines": [
            {
                "account": "604000",
                "amount": "507.00",
                "vat_code": "A21",
                "label": "Fûts Bush Caractère 20 L"
            },
            {
                "account": "613200",
                "amount": "35.00",
                "vat_code": "A21",
                "label": "Consigne et transport"
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/entries/{journalEntry}Entry read

With journal, third party, fiscal year, period and lines (account and VAT code).

Integration tokens need the read ability.

Identifiant d'opération companies.entries.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journalEntry requisintegerId of the journal entry.
ex. 1284

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma JournalEntry

Exemple
{
    "id": 1284,
    "company_id": 7,
    "fiscal_year_id": 2,
    "period_id": 16,
    "journal_id": 1,
    "number": 412,
    "entry_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-04-14T00:00:00.000000Z",
    "label": "Facture Brasserie Dubuisson SA",
    "reference": "F-2026-0412",
    "structured_communication": null,
    "third_party_id": 18,
    "status": "posted",
    "origin": "manual",
    "created_by": 12,
    "posted_at": "2026-03-16T08:12:40.000000Z",
    "reversed_entry_id": null,
    "reversed_by_entry_id": null,
    "recurring_entry_id": null,
    "created_at": "2026-03-16T08:12:40.000000Z",
    "updated_at": "2026-03-16T08:12:40.000000Z",
    "lock_version": 1,
    "version": 1,
    "lines": [
        {
            "id": 3391,
            "journal_entry_id": 1284,
            "position": 1,
            "account_id": 361,
            "third_party_id": null,
            "label": "Fûts Bush Caractère 20 L",
            "debit": "507.00",
            "credit": "0.00",
            "vat_code_id": 25,
            "vat_base": "507.00",
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 361,
                "number": "604000",
                "label": "Achats de marchandises"
            }
        },
        {
            "id": 3392,
            "journal_entry_id": 1284,
            "position": 2,
            "account_id": 384,
            "third_party_id": null,
            "label": "Consigne et transport",
            "debit": "35.00",
            "credit": "0.00",
            "vat_code_id": 25,
            "vat_base": "35.00",
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 384,
                "number": "613200",
                "label": "Transports et déplacements"
            }
        },
        {
            "id": 3393,
            "journal_entry_id": 1284,
            "position": 3,
            "account_id": 234,
            "third_party_id": null,
            "label": "TVA déductible",
            "debit": "113.82",
            "credit": "0.00",
            "vat_code_id": null,
            "vat_base": null,
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 234,
                "number": "411100",
                "label": "TVA déductible sur achats"
            }
        },
        {
            "id": 3394,
            "journal_entry_id": 1284,
            "position": 4,
            "account_id": 263,
            "third_party_id": 18,
            "label": "Brasserie Dubuisson SA",
            "debit": "0.00",
            "credit": "655.82",
            "vat_code_id": null,
            "vat_base": null,
            "reconciliation_code": null,
            "cost_center_id": null,
            "project_id": null,
            "reminder_level": 0,
            "reminder_sent_at": null,
            "account": {
                "id": 263,
                "number": "440000",
                "label": "Fournisseurs"
            }
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/entries/{journalEntry}Delete an entry write

Always refused (422) for a posted entry: numbering is continuous and the audit trail is kept. Use reverse. In a locked period the refusal carries period_locked.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.entries.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journalEntry requisintegerId of the journal entry.
ex. 1284

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/entries/{journalEntry}/reverseReverse an entry write

Posts the mirror entry (« Extourne de VEN 2026/000412 ») linked to the original, which becomes reversed. The linked document or bank transaction goes back to pending, letterings of the lines are removed and a depreciation line goes back to planned.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.entries.reverse

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journalEntry requisintegerId of the journal entry.
ex. 1284

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • entry_datestring <date> | null
    Date of the reversal; the original date by default.
  • labelstring | null
Exemple
{
    "entry_date": "2026-03-31"
}

Réponses

201Reversal entry

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma JournalEntry

Exemple
{
    "id": 1284,
    "company_id": 7,
    "fiscal_year_id": 2,
    "period_id": 16,
    "journal_id": 3,
    "number": 412,
    "entry_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "label": "Facture Brasserie Dubuisson SA",
    "reference": "F-2026-0412",
    "structured_communication": "000000000101",
    "third_party_id": 18,
    "status": "posted",
    "origin": "manual",
    "created_by": 1,
    "posted_at": "2026-03-15T09:41:00+00:00",
    "reversed_entry_id": 42,
    "reversed_by_entry_id": 42,
    "recurring_entry_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {
        "id": 3,
        "code": "VEN",
        "type": "sale"
    },
    "third_party": {
        "id": 18,
        "name": "Brasserie Dubuisson SA"
    },
    "lines": [
        {
            "id": 3391,
            "journal_entry_id": 1284,
            "position": 1,
            "account_id": 580,
            "third_party_id": 18,
            "label": "Brasserie Dubuisson SA",
            "debit": "0.00",
            "credit": "1000.00",
            "vat_code_id": 4,
            "vat_base": "1000.00",
            "reconciliation_code": "AB",
            "cost_center_id": 42,
            "project_id": 42,
            "reminder_level": 0,
            "reminder_sent_at": "2026-03-15T09:41:00+00:00",
            "account": {
                "id": 580,
                "number": "702000",
                "label": "Prestations de services"
            },
            "vat_code": {}
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284/reverse" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "entry_date": "2026-03-31"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284/reverse', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'entry_date' => '2026-03-31',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284/reverse", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "entry_date": "2026-03-31"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/1284/reverse",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "entry_date": "2026-03-31"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Recurring entries

Recurring entry templates and the quality checks of the file.

GET/v1/companies/{company}/recurring-entriesList the recurring entries read

Integration tokens need the read ability.

Identifiant d'opération companies.recurring.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma RecurringEntry[]

Tableau de RecurringEntry

Exemple
[
    {
        "id": 5,
        "company_id": 7,
        "journal_id": 5,
        "label": "Loyer mensuel",
        "reference": "F-2026-0412",
        "third_party_id": 18,
        "frequency": "monthly",
        "next_date": "2026-04-01T00:00:00.000000Z",
        "end_date": "2026-03-15T09:41:00+00:00",
        "lines": [
            {
                "account_id": 368,
                "debit": "1500.00",
                "credit": "0.00",
                "label": "Facture Brasserie Dubuisson",
                "third_party_id": 18
            }
        ],
        "is_active": true,
        "last_generated_on": "2026-03-15",
        "generated_count": 3,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "journal": {
            "id": 42,
            "code": "OD",
            "label": "Opérations diverses"
        },
        "third_party": {}
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/recurring-entriesCreate a recurring entry write

Template posted automatically every night once next_date is reached (or on demand with generate).

Integration tokens need the write ability.

Identifiant d'opération companies.recurring.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • journal_idintegerrequis
  • labelstringrequis
  • referencestring | null
  • third_party_idinteger | null
  • frequencystringrequis
    monthly quarterly yearly
  • next_datestring <date>requis
  • end_datestring <date> | null
  • is_activeboolean
  • linesobject[]requis
    Propriétés
    • account_idintegerrequis
      Postable account.
    • debitstring | null
      Decimal.
    • creditstring | null
      Decimal.
    • labelstring | null
    • third_party_idinteger | null
Exemple
{
    "journal_id": 5,
    "label": "Loyer mensuel",
    "frequency": "monthly",
    "next_date": "2026-04-01",
    "lines": [
        {
            "account_id": 368,
            "debit": "1500.00"
        },
        {
            "account_id": 263,
            "credit": "1500.00",
            "third_party_id": 22
        }
    ]
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma RecurringEntry

Exemple
{
    "id": 5,
    "company_id": 7,
    "journal_id": 5,
    "label": "Loyer mensuel",
    "reference": "F-2026-0412",
    "third_party_id": 18,
    "frequency": "monthly",
    "next_date": "2026-04-01T00:00:00.000000Z",
    "end_date": "2026-03-15T09:41:00+00:00",
    "lines": [
        {
            "account_id": 368,
            "debit": "1500.00",
            "credit": "0.00",
            "label": "Facture Brasserie Dubuisson",
            "third_party_id": 18
        }
    ],
    "is_active": true,
    "last_generated_on": "2026-03-15",
    "generated_count": 3,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 42,
        "code": "OD",
        "label": "Opérations diverses"
    },
    "third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "journal_id": 5,
    "label": "Loyer mensuel",
    "frequency": "monthly",
    "next_date": "2026-04-01",
    "lines": [
        {
            "account_id": 368,
            "debit": "1500.00"
        },
        {
            "account_id": 263,
            "credit": "1500.00",
            "third_party_id": 22
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'journal_id' => 5,
        'label' => 'Loyer mensuel',
        'frequency' => 'monthly',
        'next_date' => '2026-04-01',
        'lines' => [
            [
                'account_id' => 368,
                'debit' => '1500.00',
            ],
            [
                'account_id' => 263,
                'credit' => '1500.00',
                'third_party_id' => 22,
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "journal_id": 5,
      "label": "Loyer mensuel",
      "frequency": "monthly",
      "next_date": "2026-04-01",
      "lines": [
          {
              "account_id": 368,
              "debit": "1500.00"
          },
          {
              "account_id": 263,
              "credit": "1500.00",
              "third_party_id": 22
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "journal_id": 5,
        "label": "Loyer mensuel",
        "frequency": "monthly",
        "next_date": "2026-04-01",
        "lines": [
            {
                "account_id": 368,
                "debit": "1500.00"
            },
            {
                "account_id": 263,
                "credit": "1500.00",
                "third_party_id": 22
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/recurring-entries/generateGenerate every due entry write

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.recurring.generate-all

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • generatedinteger
    ex. 2
  • entriesobject[]
    Propriétés
    • idinteger
    • referencestring
      ex. OD 2026/000031
    • entry_datestring <date>
Exemple
{
    "generated": 2,
    "entries": [
        {
            "id": 42,
            "reference": "OD 2026/000031",
            "entry_date": "2026-03-15"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/generate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/generate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/generate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/generate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/recurring-entries/{recurringEntry}Update a recurring entry write

Integration tokens need the write ability.

Identifiant d'opération companies.recurring.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
recurringEntry requisintegerId of the recurring entry template.
ex. 5

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • journal_idinteger
  • labelstring
  • referencestring | null
  • third_party_idinteger | null
  • frequencystring
    monthly quarterly yearly
  • next_datestring <date>
  • end_datestring <date> | null
  • is_activeboolean
  • linesobject[]
    Propriétés
    • account_idintegerrequis
      Postable account.
    • debitstring | null
      Decimal.
    • creditstring | null
      Decimal.
    • labelstring | null
    • third_party_idinteger | null
Exemple
{
    "is_active": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma RecurringEntry

Exemple
{
    "id": 5,
    "company_id": 7,
    "journal_id": 5,
    "label": "Loyer mensuel",
    "reference": "F-2026-0412",
    "third_party_id": 18,
    "frequency": "monthly",
    "next_date": "2026-04-01T00:00:00.000000Z",
    "end_date": "2026-03-15T09:41:00+00:00",
    "lines": [
        {
            "account_id": 368,
            "debit": "1500.00",
            "credit": "0.00",
            "label": "Facture Brasserie Dubuisson",
            "third_party_id": 18
        }
    ],
    "is_active": true,
    "last_generated_on": "2026-03-15",
    "generated_count": 3,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 42,
        "code": "OD",
        "label": "Opérations diverses"
    },
    "third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_active": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_active' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_active": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_active": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/recurring-entries/{recurringEntry}Delete a recurring entry write

Integration tokens need the write ability.

Identifiant d'opération companies.recurring.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
recurringEntry requisintegerId of the recurring entry template.
ex. 5

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/recurring-entries/{recurringEntry}/generateGenerate the due entries of one template write

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.recurring.generate

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
recurringEntry requisintegerId of the recurring entry template.
ex. 5

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • generatedinteger
    ex. 1
  • entriesobject[]
    Propriétés
    • idinteger
    • referencestring
      ex. OD 2026/000031
    • entry_datestring <date>
Exemple
{
    "generated": 1,
    "entries": [
        {
            "id": 42,
            "reference": "OD 2026/000031",
            "entry_date": "2026-03-15"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5/generate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5/generate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5/generate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/5/generate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/qualityQuality checks read

Continuous control of the file: documents and bank transactions pending, unbalanced entries, missing numbers, third parties without VAT number, VAT declarations late…

Integration tokens need the read ability.

Identifiant d'opération companies.quality

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • checked_atstring <date-time>
  • scoreinteger
    Checks passed.
    ex. 8
  • totalinteger
    ex. 10
  • checksobject[]
    Propriétés
    • codestring
      ex. bank_pending
    • severitystring
      ok info warning error
    • countinteger
      ex. 3
    • detailobject | null
Exemple
{
    "checked_at": "2026-03-15T09:41:00+00:00",
    "score": 8,
    "total": 10,
    "checks": [
        {
            "code": "bank_pending",
            "severity": "ok",
            "count": 3,
            "detail": {}
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/quality" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/quality', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/quality", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/quality",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Documents

Invoices and receipts of the file: allocation, booking.

GET/v1/companies/{company}/documentsList the documents read

Invoices, credit notes and receipts of the file (synchronised from Novadesko or created by the importer).

Integration tokens need the read ability.

Identifiant d'opération companies.documents.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
typestring
directionstring
sale purchase
statusstring
pending booked ignored
fromstring <date>
tostring <date>
qstringNumber, third party or subject.
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 87,
            "company_id": 7,
            "source": "novadesko",
            "origin": "string",
            "external_id": "string",
            "type": "purchases",
            "direction": "sale",
            "is_credit_note": false,
            "nature": "string",
            "number": "F-2026-0412",
            "payment_provider": "string",
            "number_series": "TK",
            "document_date": "2026-03-15T00:00:00.000000Z",
            "due_date": "2026-03-15T09:41:00+00:00",
            "subject": "Vos documents comptables",
            "communication": "string",
            "currency": "EUR",
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "amount_gross": "613.47",
            "is_paid": true,
            "third_party_id": 18,
            "third_party_name": "Brasserie Dubuisson SA",
            "third_party_vat": "string",
            "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "status": "pending",
            "journal_entry_id": 1284,
            "accountant_locked": true,
            "novadesko_push_status": "string",
            "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
            "novadesko_push_error": "string",
            "document_import_id": 42,
            "synced_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "third_party": {},
            "lines": [
                {}
            ],
            "journal_entry": null
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/documents/book-allBook every pending document write 5 / 1 min

Books what can be booked; the others stay pending with the reason (a locked period is reported per document in skipped_documents).

Integration tokens need the write ability.

Rate limit: 5 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.documents.book-all

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
typestring
directionstring
sale purchase

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • bookedinteger
    ex. 42
  • skippedinteger
    ex. 3
  • skipped_documentsobject[]
    Propriétés
    • idinteger
    • numberstring | null
    • third_partystring | null
    • reasonstring
      ex. Aucun compte d'imputation sur la ligne 2.
Exemple
{
    "booked": 42,
    "skipped": 3,
    "skipped_documents": [
        {
            "id": 42,
            "number": "string",
            "third_party": "string",
            "reason": "Aucun compte d'imputation sur la ligne 2."
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/book-all" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/book-all', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/book-all", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/book-all",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/documents/{importedDocument}Document read

With its lines (recorded and actual accounts) and the entry it was booked to.

Integration tokens need the read ability.

Identifiant d'opération companies.documents.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
importedDocument requisintegerId of the document.
ex. 87

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma ImportedDocument

Exemple
{
    "id": 87,
    "company_id": 7,
    "source": "novadesko",
    "origin": "string",
    "external_id": "string",
    "type": "purchases",
    "direction": "sale",
    "is_credit_note": false,
    "nature": "string",
    "number": "F-2026-0412",
    "payment_provider": "string",
    "number_series": "TK",
    "document_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "subject": "Vos documents comptables",
    "communication": "string",
    "currency": "EUR",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "amount_gross": "613.47",
    "is_paid": true,
    "third_party_id": 18,
    "third_party_name": "Brasserie Dubuisson SA",
    "third_party_vat": "string",
    "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "pending",
    "journal_entry_id": 1284,
    "accountant_locked": true,
    "novadesko_push_status": "string",
    "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
    "novadesko_push_error": "string",
    "document_import_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "third_party": {},
    "lines": [
        {
            "id": 640,
            "imported_document_id": 87,
            "external_id": "string",
            "position": 1,
            "description": "Fûts Bush Caractère 20 L",
            "quantity": "6.000",
            "unit_price": "84.5000",
            "discount_pct": "1210.00",
            "tax_rate": "21.00",
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "recorded_account_number": "604000",
            "recorded_account_id": 42,
            "actual_account_id": 42,
            "vat_code_id": 4,
            "purchase_category": "string",
            "corrected_at": "2026-03-15T09:41:00+00:00",
            "corrected_by": 1,
            "correction_pushed": true,
            "recorded_account": {},
            "actual_account": {},
            "vat_code": {}
        }
    ],
    "journal_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {}
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/documents/{importedDocument}/lines/{line}Correct the allocation of a line write

Sets the account chosen by the accountant (« actual » layer); account_id: null goes back to the recorded account.

Integration tokens need the write ability.

Identifiant d'opération companies.documents.lines.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
importedDocument requisintegerId of the document.
ex. 87
line requisintegerId of the line.
ex. 3391

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • account_idinteger | null
    Postable account.
  • vat_code_idinteger | null
Exemple
{
    "account_id": 361
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma ImportedDocumentLine

Exemple
{
    "id": 640,
    "imported_document_id": 87,
    "external_id": "string",
    "position": 1,
    "description": "Fûts Bush Caractère 20 L",
    "quantity": "6.000",
    "unit_price": "84.5000",
    "discount_pct": "1210.00",
    "tax_rate": "21.00",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "recorded_account_number": "604000",
    "recorded_account_id": 42,
    "actual_account_id": 42,
    "vat_code_id": 4,
    "purchase_category": "string",
    "corrected_at": "2026-03-15T09:41:00+00:00",
    "corrected_by": 1,
    "correction_pushed": true,
    "recorded_account": {},
    "actual_account": {},
    "vat_code": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/lines/3391" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "account_id": 361
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/lines/3391', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'account_id' => 361,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/lines/3391", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "account_id": 361
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/lines/3391",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "account_id": 361
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/documents/{importedDocument}/bookBook a document write

Posts the entry of the document in the journal resolved by the journal rules.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.documents.book

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
importedDocument requisintegerId of the document.
ex. 87

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

201Booked, with journal_entry

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma ImportedDocument

Exemple
{
    "id": 87,
    "company_id": 7,
    "source": "novadesko",
    "origin": "string",
    "external_id": "string",
    "type": "purchases",
    "direction": "sale",
    "is_credit_note": false,
    "nature": "string",
    "number": "F-2026-0412",
    "payment_provider": "string",
    "number_series": "TK",
    "document_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "subject": "Vos documents comptables",
    "communication": "string",
    "currency": "EUR",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "amount_gross": "613.47",
    "is_paid": true,
    "third_party_id": 18,
    "third_party_name": "Brasserie Dubuisson SA",
    "third_party_vat": "string",
    "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "pending",
    "journal_entry_id": 1284,
    "accountant_locked": true,
    "novadesko_push_status": "string",
    "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
    "novadesko_push_error": "string",
    "document_import_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "third_party": {},
    "lines": [
        {
            "id": 640,
            "imported_document_id": 87,
            "external_id": "string",
            "position": 1,
            "description": "Fûts Bush Caractère 20 L",
            "quantity": "6.000",
            "unit_price": "84.5000",
            "discount_pct": "1210.00",
            "tax_rate": "21.00",
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "recorded_account_number": "604000",
            "recorded_account_id": 42,
            "actual_account_id": 42,
            "vat_code_id": 4,
            "purchase_category": "string",
            "corrected_at": "2026-03-15T09:41:00+00:00",
            "corrected_by": 1,
            "correction_pushed": true,
            "recorded_account": {},
            "actual_account": {},
            "vat_code": {}
        }
    ],
    "journal_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {}
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/book" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/book', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/book", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/book",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/documents/{importedDocument}/ignoreIgnore or restore a document write

An ignored document is left out of the booking; restore: true puts it back to pending. Refused for a booked document.

Integration tokens need the write ability.

Identifiant d'opération companies.documents.ignore

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
importedDocument requisintegerId of the document.
ex. 87

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • restoreboolean
Exemple
{
    "restore": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma ImportedDocument

Exemple
{
    "id": 87,
    "company_id": 7,
    "source": "novadesko",
    "origin": "string",
    "external_id": "string",
    "type": "purchases",
    "direction": "sale",
    "is_credit_note": false,
    "nature": "string",
    "number": "F-2026-0412",
    "payment_provider": "string",
    "number_series": "TK",
    "document_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "subject": "Vos documents comptables",
    "communication": "string",
    "currency": "EUR",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "amount_gross": "613.47",
    "is_paid": true,
    "third_party_id": 18,
    "third_party_name": "Brasserie Dubuisson SA",
    "third_party_vat": "string",
    "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "pending",
    "journal_entry_id": 1284,
    "accountant_locked": true,
    "novadesko_push_status": "string",
    "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
    "novadesko_push_error": "string",
    "document_import_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "third_party": {},
    "lines": [
        {
            "id": 640,
            "imported_document_id": 87,
            "external_id": "string",
            "position": 1,
            "description": "Fûts Bush Caractère 20 L",
            "quantity": "6.000",
            "unit_price": "84.5000",
            "discount_pct": "1210.00",
            "tax_rate": "21.00",
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "recorded_account_number": "604000",
            "recorded_account_id": 42,
            "actual_account_id": 42,
            "vat_code_id": 4,
            "purchase_category": "string",
            "corrected_at": "2026-03-15T09:41:00+00:00",
            "corrected_by": 1,
            "correction_pushed": true,
            "recorded_account": {},
            "actual_account": {},
            "vat_code": {}
        }
    ],
    "journal_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {}
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/ignore" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "restore": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/ignore', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'restore' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/ignore", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "restore": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/87/ignore",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "restore": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Document importer

Upload of PDF, images, UBL / CII XML and ZIP files, analysis, validation.

GET/v1/companies/{company}/document-importsList the imports read

Polling list of the uploaded files, without raw_text.

Integration tokens need the read ability.

Identifiant d'opération companies.document-imports.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
batch_idstring <uuid>
statusstringComma-separated statuses.
ex. ready,needs_review
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 311,
            "company_id": 7,
            "uploaded_by": 1,
            "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "parent_import_id": 42,
            "original_name": "facture-dubuisson-0412.pdf",
            "mime": "application/pdf",
            "size": 184320,
            "file_hash": "string",
            "kind": "pdf",
            "status": "queued",
            "progress": 100,
            "step": "upload",
            "engine": "api",
            "extracted": null,
            "raw_text": "string",
            "warnings": [
                "string"
            ],
            "error": "string",
            "suggested_third_party_id": 42,
            "suggested_direction": "string",
            "duplicate_of_import_id": 42,
            "duplicate_of_document_id": 42,
            "imported_document_id": 42,
            "novadesko_document_id": "string",
            "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
            "started_at": "2026-03-15T09:41:00+00:00",
            "finished_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "suggested_third_party": {}
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/document-importsUpload files write Hors démo 30 / 1 min

Multipart upload of 1 to 20 files, 25 MB each: PDF, images (JPEG, PNG, HEIC, WebP), UBL / CII XML, or a ZIP of those (50 files max, expanded into child imports). Files are stored and queued; call process for a synchronous analysis or let the scheduler analyse them within a minute.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.document-imports.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

multipart/form-data

Schéma object
  • files[]string <binary>[]requis
  • batch_idstring <uuid>
    Reuse a batch to add files to it.

Réponses

201Files stored

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "imports": [
        {
            "id": 311,
            "company_id": 7,
            "uploaded_by": 1,
            "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "parent_import_id": 42,
            "original_name": "facture-dubuisson-0412.pdf",
            "mime": "application/pdf",
            "size": 184320,
            "file_hash": "string",
            "kind": "pdf",
            "status": "queued",
            "progress": 100,
            "step": "upload",
            "engine": "api",
            "extracted": null,
            "raw_text": "string",
            "warnings": [
                "string"
            ],
            "error": "string",
            "suggested_third_party_id": 42,
            "suggested_direction": "string",
            "duplicate_of_import_id": 42,
            "duplicate_of_document_id": 42,
            "imported_document_id": 42,
            "novadesko_document_id": "string",
            "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
            "started_at": "2026-03-15T09:41:00+00:00",
            "finished_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "suggested_third_party": {}
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -F "files[]=@facture-0412.pdf" \
  -F "files[]=@facture-0413.pdf"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'multipart' => [
        ['name' => 'files[]', 'contents' => fopen('facture-0412.pdf', 'r'), 'filename' => 'facture-0412.pdf'],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const form = new FormData();
form.append("files[]", fileInput.files[0]);

const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: form,
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    files=[("files[]", open("facture-0412.pdf", "rb"))],
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/document-imports/enginesAnalysis engines read

Engines able to read a document and whether each is configured.

Integration tokens need the read ability.

Identifiant d'opération companies.document-imports.engines

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • enginesobject[]
    Propriétés
    • idstring
      ex. api
    • configuredboolean
Exemple
{
    "engines": [
        {
            "id": "api",
            "configured": true
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/engines" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/engines', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/engines", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/engines",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/document-imports/{documentImport}Import read

With the extracted data and the text layer.

Integration tokens need the read ability.

Identifiant d'opération companies.document-imports.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma DocumentImport

Exemple
{
    "id": 311,
    "company_id": 7,
    "uploaded_by": 1,
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "parent_import_id": 42,
    "original_name": "facture-dubuisson-0412.pdf",
    "mime": "application/pdf",
    "size": 184320,
    "file_hash": "string",
    "kind": "pdf",
    "status": "queued",
    "progress": 100,
    "step": "upload",
    "engine": "api",
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    },
    "raw_text": "string",
    "warnings": [
        "string"
    ],
    "error": "string",
    "suggested_third_party_id": 42,
    "suggested_direction": "string",
    "duplicate_of_import_id": 42,
    "duplicate_of_document_id": 42,
    "imported_document_id": 42,
    "novadesko_document_id": "string",
    "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "suggested_third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/document-imports/{documentImport}Correct the extracted data write

Saves corrections without validating. Only for the statuses ready, needs_review and duplicate.

Integration tokens need the write ability.

Identifiant d'opération companies.document-imports.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
Exemple
{
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    }
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma DocumentImport

Exemple
{
    "id": 311,
    "company_id": 7,
    "uploaded_by": 1,
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "parent_import_id": 42,
    "original_name": "facture-dubuisson-0412.pdf",
    "mime": "application/pdf",
    "size": 184320,
    "file_hash": "string",
    "kind": "pdf",
    "status": "queued",
    "progress": 100,
    "step": "upload",
    "engine": "api",
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    },
    "raw_text": "string",
    "warnings": [
        "string"
    ],
    "error": "string",
    "suggested_third_party_id": 42,
    "suggested_direction": "string",
    "duplicate_of_import_id": 42,
    "duplicate_of_document_id": 42,
    "imported_document_id": 42,
    "novadesko_document_id": "string",
    "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "suggested_third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    }
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'extracted' => [
            'direction' => 'purchase',
            'is_credit_note' => false,
            'number' => 'F-2026-0412',
            'document_date' => '2026-03-15',
            'due_date' => '2026-03-15',
            'currency' => 'EUR',
            'supplier' => [
                'name' => 'Brasserie Dubuisson SA',
                'vat_number' => 'BE0402531376',
                'enterprise_number' => '0477472701',
                'address' => 'Grand-Place 14',
                'postal_code' => '7000',
                'city' => 'Mons',
                'country' => 'BE',
                'iban' => 'BE68539007547034',
                'email' => 'claire.dumont@fiduciaire-dumont.be',
            ],
            'customer' => [],
            'amount_net' => '507.00',
            'amount_vat' => '106.47',
            'amount_gross' => '613.47',
            'structured_communication' => '000000000101',
            'confidence' => 0.93,
            'lines' => [
                [
                    'description' => 'Fûts Bush Caractère 20 L',
                    'quantity' => 6,
                    'unit_price' => 84.5,
                    'tax_rate' => 21,
                    'amount_net' => '507.00',
                    'amount_vat' => '106.47',
                    'account_id' => 580,
                    'account_number' => '604000',
                    'vat_code_id' => 4,
                    'vat_code' => 'A21',
                ],
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "extracted": {
          "direction": "purchase",
          "is_credit_note": false,
          "number": "F-2026-0412",
          "document_date": "2026-03-15",
          "due_date": "2026-03-15",
          "currency": "EUR",
          "supplier": {
              "name": "Brasserie Dubuisson SA",
              "vat_number": "BE0402531376",
              "enterprise_number": "0477472701",
              "address": "Grand-Place 14",
              "postal_code": "7000",
              "city": "Mons",
              "country": "BE",
              "iban": "BE68539007547034",
              "email": "claire.dumont@fiduciaire-dumont.be"
          },
          "customer": {},
          "amount_net": "507.00",
          "amount_vat": "106.47",
          "amount_gross": "613.47",
          "structured_communication": "000000000101",
          "confidence": 0.93,
          "lines": [
              {
                  "description": "Fûts Bush Caractère 20 L",
                  "quantity": 6,
                  "unit_price": 84.5,
                  "tax_rate": 21,
                  "amount_net": "507.00",
                  "amount_vat": "106.47",
                  "account_id": 580,
                  "account_number": "604000",
                  "vat_code_id": 4,
                  "vat_code": "A21"
              }
          ]
      }
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "extracted": {
            "direction": "purchase",
            "is_credit_note": False,
            "number": "F-2026-0412",
            "document_date": "2026-03-15",
            "due_date": "2026-03-15",
            "currency": "EUR",
            "supplier": {
                "name": "Brasserie Dubuisson SA",
                "vat_number": "BE0402531376",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "postal_code": "7000",
                "city": "Mons",
                "country": "BE",
                "iban": "BE68539007547034",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "customer": {},
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "amount_gross": "613.47",
            "structured_communication": "000000000101",
            "confidence": 0.93,
            "lines": [
                {
                    "description": "Fûts Bush Caractère 20 L",
                    "quantity": 6,
                    "unit_price": 84.5,
                    "tax_rate": 21,
                    "amount_net": "507.00",
                    "amount_vat": "106.47",
                    "account_id": 580,
                    "account_number": "604000",
                    "vat_code_id": 4,
                    "vat_code": "A21"
                }
            ]
        }
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/document-imports/{documentImport}Delete an import write

Goes to the recycle bin. A validated import keeps its document.

Integration tokens need the write ability.

Identifiant d'opération companies.document-imports.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-Trashed

application/json

Schéma object
  • deletedboolean
Exemple
{
    "deleted": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/document-imports/{documentImport}/processAnalyse an import now write Hors démo 120 / 1 min

Synchronous analysis (up to two minutes): text layer, extraction, account suggestions, third party matching, duplicate detection. Already analysed: returns the result.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.document-imports.process

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma DocumentImport

Exemple
{
    "id": 311,
    "company_id": 7,
    "uploaded_by": 1,
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "parent_import_id": 42,
    "original_name": "facture-dubuisson-0412.pdf",
    "mime": "application/pdf",
    "size": 184320,
    "file_hash": "string",
    "kind": "pdf",
    "status": "queued",
    "progress": 100,
    "step": "upload",
    "engine": "api",
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    },
    "raw_text": "string",
    "warnings": [
        "string"
    ],
    "error": "string",
    "suggested_third_party_id": 42,
    "suggested_direction": "string",
    "duplicate_of_import_id": 42,
    "duplicate_of_document_id": 42,
    "imported_document_id": 42,
    "novadesko_document_id": "string",
    "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "suggested_third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/process" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/process', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/process", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/process",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/document-imports/{documentImport}/retryAnalyse again write Hors démo 60 / 1 min

force re-analyses a file flagged as the duplicate of another import.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.document-imports.retry

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • forceboolean
Exemple
{
    "force": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma DocumentImport

Exemple
{
    "id": 311,
    "company_id": 7,
    "uploaded_by": 1,
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "parent_import_id": 42,
    "original_name": "facture-dubuisson-0412.pdf",
    "mime": "application/pdf",
    "size": 184320,
    "file_hash": "string",
    "kind": "pdf",
    "status": "queued",
    "progress": 100,
    "step": "upload",
    "engine": "api",
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    },
    "raw_text": "string",
    "warnings": [
        "string"
    ],
    "error": "string",
    "suggested_third_party_id": 42,
    "suggested_direction": "string",
    "duplicate_of_import_id": 42,
    "duplicate_of_document_id": 42,
    "imported_document_id": 42,
    "novadesko_document_id": "string",
    "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "suggested_third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/retry" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "force": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/retry', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'force' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/retry", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "force": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/retry",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "force": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/document-imports/{documentImport}/validateValidate an import write 120 / 1 min

Creates the document (locked for the shop), books it unless book: false, and pushes it to Novadesko when the file is linked (never from the demo). The third party is third_party_id, or created from new_third_party.

Integration tokens need the write ability.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.document-imports.validate

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • third_party_idinteger | null
  • new_third_partyobject
    Propriétés
    • typestring
      supplier customer
    • namestringrequis
    • vat_numberstring | null
    • enterprise_numberstring | null
    • addressstring | null
    • postal_codestring | null
    • citystring | null
    • countrystring | null
    • ibanstring | null
    • bicstring | null
    • emailstring <email> | null
    • phonestring | null
  • directionstring
    purchase sale
  • linesobject[]
    Propriétés
    • account_idinteger | null
    • vat_code_idinteger | null
  • bookboolean
    True by default.
  • push_to_novadeskoboolean | null
  • forceboolean
    Validate despite a duplicate warning.
Exemple
{
    "third_party_id": 18,
    "direction": "purchase",
    "lines": [
        {
            "account_id": 361,
            "vat_code_id": 25
        }
    ],
    "book": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "import": {
        "id": 311,
        "company_id": 7,
        "uploaded_by": 1,
        "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
        "parent_import_id": 42,
        "original_name": "facture-dubuisson-0412.pdf",
        "mime": "application/pdf",
        "size": 184320,
        "file_hash": "string",
        "kind": "pdf",
        "status": "queued",
        "progress": 100,
        "step": "upload",
        "engine": "api",
        "extracted": {
            "direction": "purchase",
            "is_credit_note": false,
            "number": "F-2026-0412",
            "document_date": "2026-03-15",
            "due_date": "2026-03-15",
            "currency": "EUR",
            "supplier": {
                "name": "Brasserie Dubuisson SA",
                "vat_number": "BE0402531376",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "postal_code": "7000",
                "city": "Mons",
                "country": "BE",
                "iban": "BE68539007547034",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "customer": {},
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "amount_gross": "613.47",
            "structured_communication": "000000000101",
            "confidence": 0.93,
            "lines": [
                {
                    "description": "Fûts Bush Caractère 20 L",
                    "quantity": 6,
                    "unit_price": 84.5,
                    "tax_rate": 21,
                    "amount_net": "507.00",
                    "amount_vat": "106.47",
                    "account_id": 580,
                    "account_number": "604000",
                    "vat_code_id": 4,
                    "vat_code": "A21"
                }
            ]
        },
        "raw_text": "string",
        "warnings": [
            "string"
        ],
        "error": "string",
        "suggested_third_party_id": 42,
        "suggested_direction": "string",
        "duplicate_of_import_id": 42,
        "duplicate_of_document_id": 42,
        "imported_document_id": 42,
        "novadesko_document_id": "string",
        "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
        "started_at": "2026-03-15T09:41:00+00:00",
        "finished_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "suggested_third_party": {}
    },
    "document": {
        "id": 87,
        "company_id": 7,
        "source": "novadesko",
        "origin": "string",
        "external_id": "string",
        "type": "purchases",
        "direction": "sale",
        "is_credit_note": false,
        "nature": "string",
        "number": "F-2026-0412",
        "payment_provider": "string",
        "number_series": "TK",
        "document_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "subject": "Vos documents comptables",
        "communication": "string",
        "currency": "EUR",
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "is_paid": true,
        "third_party_id": 18,
        "third_party_name": "Brasserie Dubuisson SA",
        "third_party_vat": "string",
        "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "status": "pending",
        "journal_entry_id": 1284,
        "accountant_locked": true,
        "novadesko_push_status": "string",
        "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
        "novadesko_push_error": "string",
        "document_import_id": 42,
        "synced_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "third_party": {},
        "lines": [
            {
                "id": 640,
                "imported_document_id": 87,
                "external_id": "string",
                "position": 1,
                "description": "Fûts Bush Caractère 20 L",
                "quantity": "6.000",
                "unit_price": "84.5000",
                "discount_pct": "1210.00",
                "tax_rate": "21.00",
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "recorded_account_number": "604000",
                "recorded_account_id": 42,
                "actual_account_id": 42,
                "vat_code_id": 4,
                "purchase_category": "string",
                "corrected_at": "2026-03-15T09:41:00+00:00",
                "corrected_by": 1,
                "correction_pushed": true,
                "recorded_account": {},
                "actual_account": {},
                "vat_code": {}
            }
        ],
        "journal_entry": {
            "id": 1284,
            "company_id": 7,
            "fiscal_year_id": 2,
            "period_id": 16,
            "journal_id": 3,
            "number": 412,
            "entry_date": "2026-03-15T00:00:00.000000Z",
            "due_date": "2026-03-15T09:41:00+00:00",
            "label": "Facture Brasserie Dubuisson SA",
            "reference": "F-2026-0412",
            "structured_communication": "000000000101",
            "third_party_id": 18,
            "status": "posted",
            "origin": "manual",
            "created_by": 1,
            "posted_at": "2026-03-15T09:41:00+00:00",
            "reversed_entry_id": 42,
            "reversed_by_entry_id": 42,
            "recurring_entry_id": 42,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "journal": {
                "id": 3,
                "code": "VEN",
                "type": "sale"
            },
            "third_party": {
                "id": 18,
                "name": "Brasserie Dubuisson SA"
            },
            "lines": [
                {}
            ]
        }
    },
    "entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    },
    "novadesko": {
        "status": "skipped",
        "message": "OK"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/validate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "third_party_id": 18,
    "direction": "purchase",
    "lines": [
        {
            "account_id": 361,
            "vat_code_id": 25
        }
    ],
    "book": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/validate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'third_party_id' => 18,
        'direction' => 'purchase',
        'lines' => [
            [
                'account_id' => 361,
                'vat_code_id' => 25,
            ],
        ],
        'book' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/validate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "third_party_id": 18,
      "direction": "purchase",
      "lines": [
          {
              "account_id": 361,
              "vat_code_id": 25
          }
      ],
      "book": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/validate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "third_party_id": 18,
        "direction": "purchase",
        "lines": [
            {
                "account_id": 361,
                "vat_code_id": 25
            }
        ],
        "book": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/document-imports/{documentImport}/fileSigned preview of an uploaded file URL signée 240 / 1 min

Serves the file inline (or its preview: PDF embedded in a UBL, JPEG converted from HEIC).

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 240 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération document-imports.file

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
documentImport requisintegerId of the import (uploaded file).
ex. 311

Paramètres de requête

NomTypeDescription
previewstring0 serves the original file.
0 1

Entêtes communs : signature expires

Réponses

200The file, inline.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

application/pdf

image/jpeg

image/png

application/xml

403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/file" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/file', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/file", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/document-imports/311/file",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Bank

Bank transactions (CODA), matching, rules, treasury, SEPA payment files.

GET/v1/companies/{company}/bank-transactionsList the bank transactions read

Transactions of the CODA statements with the proposed match.

Integration tokens need the read ability.

Identifiant d'opération companies.bank-transactions.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
unmatchedbooleanPending and without proposal.
journal_idinteger
statusstring
pending booked ignored
fromstring <date>Value date.
tostring <date>
qstringCounterpart, communication or description.
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 100, maximum 500).
ex. 100

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 951,
            "company_id": 7,
            "source": "novadesko",
            "external_id": "string",
            "account_iban": "BE68539007547034",
            "account_bank": "string",
            "journal_id": 7,
            "amount": "1210.00",
            "currency": "EUR",
            "value_date": "2026-03-18T00:00:00.000000Z",
            "execution_date": "2026-03-15T09:41:00+00:00",
            "counterpart_name": "ACME SA",
            "counterpart_iban": "string",
            "communication": "+++000/0000/00101+++",
            "description": "Description",
            "status": "pending",
            "journal_entry_id": 1284,
            "matched_journal_entry_id": 42,
            "match_confidence": "high",
            "match_reason": "structured_communication",
            "matched_at": "2026-03-15T09:41:00+00:00",
            "booked_account_id": 42,
            "matched_rule_id": 42,
            "synced_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "journal": {},
            "links": [
                {}
            ],
            "matched_entry": {},
            "booked_account": {},
            "matched_rule": {},
            "journal_entry": {}
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/bank-transactions/matchPropose the matches write 10 / 1 min

Looks for the invoice paid by each pending transaction (structured communication, Novadesko link, amount and third party) and applies the bank rules.

Integration tokens need the write ability.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.bank-transactions.match

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • proposalsinteger
    ex. 17
Exemple
{
    "proposals": 17
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/match" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/match', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/match", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/match",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/bank-transactions/book-matchedBook the matched transactions write 5 / 1 min

Books every transaction with a high-confidence match (and medium ones with include_medium).

Integration tokens need the write ability.

Rate limit: 5 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.bank-transactions.book-matched

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • include_mediumboolean
Exemple
{
    "include_medium": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • bookedinteger
    ex. 14
  • skippedobject[]
    Propriétés
    • idinteger
    • reasonstring
Exemple
{
    "booked": 14,
    "skipped": [
        {
            "id": 42,
            "reason": "string"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/book-matched" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "include_medium": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/book-matched', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'include_medium' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/book-matched", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "include_medium": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/book-matched",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "include_medium": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/bank-transactions/{bankTransaction}/bookBook a transaction write

Payment of the matched invoice (lettered with it), or allocation to the chosen account (fees, VAT, salaries…).

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.bank-transactions.book

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
bankTransaction requisintegerId of the bank transaction.
ex. 951

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • account_idinteger | null
    Postable account; absent = payment of the matched invoice.
  • third_party_idinteger | null
  • labelstring | null
Exemple
{
    "account_id": 517,
    "label": "Frais de tenue de compte"
}

Réponses

201Booked, with journal_entry

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma BankTransaction

Exemple
{
    "id": 951,
    "company_id": 7,
    "source": "novadesko",
    "external_id": "string",
    "account_iban": "BE68539007547034",
    "account_bank": "string",
    "journal_id": 7,
    "amount": "1210.00",
    "currency": "EUR",
    "value_date": "2026-03-18T00:00:00.000000Z",
    "execution_date": "2026-03-15T09:41:00+00:00",
    "counterpart_name": "ACME SA",
    "counterpart_iban": "string",
    "communication": "+++000/0000/00101+++",
    "description": "Description",
    "status": "pending",
    "journal_entry_id": 1284,
    "matched_journal_entry_id": 42,
    "match_confidence": "high",
    "match_reason": "structured_communication",
    "matched_at": "2026-03-15T09:41:00+00:00",
    "booked_account_id": 42,
    "matched_rule_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {},
    "links": [
        {}
    ],
    "matched_entry": {},
    "booked_account": {},
    "matched_rule": {},
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/book" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "account_id": 517,
    "label": "Frais de tenue de compte"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/book', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'account_id' => 517,
        'label' => 'Frais de tenue de compte',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/book", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "account_id": 517,
      "label": "Frais de tenue de compte"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/book",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "account_id": 517,
        "label": "Frais de tenue de compte"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/bank-transactions/{bankTransaction}/ignoreIgnore or restore a transaction write

Integration tokens need the write ability.

Identifiant d'opération companies.bank-transactions.ignore

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
bankTransaction requisintegerId of the bank transaction.
ex. 951

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • restoreboolean
Exemple
{
    "restore": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma BankTransaction

Exemple
{
    "id": 951,
    "company_id": 7,
    "source": "novadesko",
    "external_id": "string",
    "account_iban": "BE68539007547034",
    "account_bank": "string",
    "journal_id": 7,
    "amount": "1210.00",
    "currency": "EUR",
    "value_date": "2026-03-18T00:00:00.000000Z",
    "execution_date": "2026-03-15T09:41:00+00:00",
    "counterpart_name": "ACME SA",
    "counterpart_iban": "string",
    "communication": "+++000/0000/00101+++",
    "description": "Description",
    "status": "pending",
    "journal_entry_id": 1284,
    "matched_journal_entry_id": 42,
    "match_confidence": "high",
    "match_reason": "structured_communication",
    "matched_at": "2026-03-15T09:41:00+00:00",
    "booked_account_id": 42,
    "matched_rule_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {},
    "links": [
        {}
    ],
    "matched_entry": {},
    "booked_account": {},
    "matched_rule": {},
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/ignore" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "restore": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/ignore', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'restore' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/ignore", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "restore": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/951/ignore",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "restore": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/treasuryTreasury read

Accounting balance of each financial journal against the last statement, with the pending transactions.

Integration tokens need the read ability.

Identifiant d'opération companies.treasury

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Treasury

Exemple
{
    "accounts": [
        {
            "journal_id": 7,
            "code": "BNP",
            "label": "BNP Paribas Fortis",
            "iban": "BE68539007547034",
            "account": "550000",
            "accounting_balance": "19630.11",
            "last_statement_balance": "19630.11",
            "last_statement_date": "2026-03-15",
            "pending_count": 3,
            "pending_amount": "1842.50",
            "difference": "0.00"
        }
    ],
    "total_accounting_balance": "21480.61"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/treasury" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/treasury', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/treasury", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/treasury",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/bank-rulesList the bank rules read

Integration tokens need the read ability.

Identifiant d'opération companies.bank-rules.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma BankRule[]

Tableau de BankRule

Exemple
[
    {
        "id": 6,
        "company_id": 7,
        "name": "Frais bancaires",
        "field": "counterpart_name",
        "operator": "contains",
        "pattern": "frais de tenue",
        "direction": "in",
        "account_id": 517,
        "third_party_id": 18,
        "label": "Facture Brasserie Dubuisson",
        "priority": 100,
        "is_active": true,
        "applied_count": 14,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "third_party": {}
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/bank-rulesCreate a bank rule write

Allocates the transactions whose field matches the pattern to an account.

Integration tokens need the write ability.

Identifiant d'opération companies.bank-rules.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • namestringrequis
  • fieldstringrequis
    counterpart_name counterpart_iban communication description any
  • operatorstring
    contains equals starts
  • patternstringrequis
  • directionstring
    in out any
  • account_idintegerrequis
    Postable account.
  • third_party_idinteger | null
  • labelstring | null
  • priorityinteger
    1 to 999.
  • is_activeboolean
Exemple
{
    "name": "Frais bancaires",
    "field": "description",
    "operator": "contains",
    "pattern": "frais de tenue",
    "direction": "out",
    "account_id": 517
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma BankRule

Exemple
{
    "id": 6,
    "company_id": 7,
    "name": "Frais bancaires",
    "field": "counterpart_name",
    "operator": "contains",
    "pattern": "frais de tenue",
    "direction": "in",
    "account_id": 517,
    "third_party_id": 18,
    "label": "Facture Brasserie Dubuisson",
    "priority": 100,
    "is_active": true,
    "applied_count": 14,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "name": "Frais bancaires",
    "field": "description",
    "operator": "contains",
    "pattern": "frais de tenue",
    "direction": "out",
    "account_id": 517
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'name' => 'Frais bancaires',
        'field' => 'description',
        'operator' => 'contains',
        'pattern' => 'frais de tenue',
        'direction' => 'out',
        'account_id' => 517,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "name": "Frais bancaires",
      "field": "description",
      "operator": "contains",
      "pattern": "frais de tenue",
      "direction": "out",
      "account_id": 517
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "name": "Frais bancaires",
        "field": "description",
        "operator": "contains",
        "pattern": "frais de tenue",
        "direction": "out",
        "account_id": 517
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/bank-rules/{bankRule}Update a bank rule write

Integration tokens need the write ability.

Identifiant d'opération companies.bank-rules.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
bankRule requisintegerId of the bank rule.
ex. 6

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • namestring
  • fieldstring
    counterpart_name counterpart_iban communication description any
  • operatorstring
    contains equals starts
  • patternstring
  • directionstring
    in out any
  • account_idinteger
    Postable account.
  • third_party_idinteger | null
  • labelstring | null
  • priorityinteger
    1 to 999.
  • is_activeboolean
Exemple
{
    "is_active": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma BankRule

Exemple
{
    "id": 6,
    "company_id": 7,
    "name": "Frais bancaires",
    "field": "counterpart_name",
    "operator": "contains",
    "pattern": "frais de tenue",
    "direction": "in",
    "account_id": 517,
    "third_party_id": 18,
    "label": "Facture Brasserie Dubuisson",
    "priority": 100,
    "is_active": true,
    "applied_count": 14,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "third_party": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_active": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_active' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_active": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_active": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/bank-rules/{bankRule}Delete a bank rule write

Integration tokens need the write ability.

Identifiant d'opération companies.bank-rules.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
bankRule requisintegerId of the bank rule.
ex. 6

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-rules/6",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/coda-filesList the CODA files read

Integration tokens need the read ability.

Identifiant d'opération companies.coda-files.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
journal_idinteger
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 31,
            "company_id": 7,
            "source": "novadesko",
            "external_id": "string",
            "filename": "CODA_2026_031.cod",
            "source_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "account_iban": "BE68539007547034",
            "account_bank": "string",
            "journal_id": 3,
            "statement_number": "031",
            "sequence": "string",
            "opening_balance": "18420.11",
            "closing_balance": "19630.11",
            "period_from": "2026-03-15T09:41:00+00:00",
            "period_to": "2026-03-15T09:41:00+00:00",
            "transactions_count": 12,
            "status": "imported",
            "synced_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "journal": {}
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/coda-files/{codaFile}/downloadDownload a CODA file read

Original statement file.

Integration tokens need the read ability.

Identifiant d'opération companies.coda-files.download

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
codaFile requisintegerId of the CODA file.
ex. 31

Entêtes communs : Accept-Language

Réponses

200The CODA file.

Entêtes de réponse Content-Disposition

text/plain

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files/31/download" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files/31/download', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files/31/download", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/coda-files/31/download",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/payments/open-itemsSupplier items to pay read

Open supplier lines; payable is false when the IBAN of the supplier is missing.

Integration tokens need the read ability.

Identifiant d'opération companies.payments.open-items

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • itemsobject[]
    Propriétés
    • line_idinteger
    • entry_idinteger
    • referencestring
      ex. ACH 2026/000412
    • journal_codestring
      ex. ACH
    • entry_datestring <date>
    • due_datestring <date> | null
    • overdueboolean
    • labelstring
    • external_referencestring | null
      ex. F-2026-0412
    • structured_communicationstring | null
    • third_party_idinteger
    • third_partystring
      ex. Brasserie Dubuisson SA
    • ibanstring | null
    • bicstring | null
    • amountstring <decimal>
      ex. 655.82
    • payableboolean
  • totalstring <decimal>
    ex. 655.82
  • payable_countinteger
    ex. 1
Exemple
{
    "items": [
        {
            "line_id": 3391,
            "entry_id": 1284,
            "reference": "ACH 2026/000412",
            "journal_code": "ACH",
            "entry_date": "2026-03-15",
            "due_date": "2026-03-15",
            "overdue": true,
            "label": "Facture Brasserie Dubuisson",
            "external_reference": "F-2026-0412",
            "structured_communication": "000000000101",
            "third_party_id": 18,
            "third_party": "Brasserie Dubuisson SA",
            "iban": "BE68539007547034",
            "bic": "GEBABEBB",
            "amount": "655.82",
            "payable": true
        }
    ],
    "total": "655.82",
    "payable_count": 1
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/open-items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/open-items', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/open-items", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/open-items",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/payments/sepaGenerate a SEPA credit transfer file write Hors démo 20 / 1 min

pain.001 XML for the chosen open items, debited from the bank of a financial journal. The file is to be uploaded to the bank: NovaFisko never initiates a payment.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 20 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.payments.sepa

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • journal_idintegerrequis
    Financial journal with an IBAN.
  • line_idsinteger[]requis
  • execution_datestring <date>requis
    Today or later.
Exemple
{
    "journal_id": 7,
    "line_ids": [
        3394,
        3410
    ],
    "execution_date": "2026-04-02"
}

Réponses

200SEPA pain.001 file. Headers X-Sepa-Count and X-Sepa-Total give the number of transfers and their total.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/sepa" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "journal_id": 7,
    "line_ids": [
        3394,
        3410
    ],
    "execution_date": "2026-04-02"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/sepa', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'journal_id' => 7,
        'line_ids' => [
            3394,
            3410,
        ],
        'execution_date' => '2026-04-02',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/sepa", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "journal_id": 7,
      "line_ids": [
          3394,
          3410
      ],
      "execution_date": "2026-04-02"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/payments/sepa",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "journal_id": 7,
        "line_ids": [
            3394,
            3410
        ],
        "execution_date": "2026-04-02"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

VAT

VAT codes, periodic declarations, Intervat XML, customer and intra-community listings.

GET/v1/companies/{company}/vat-codesVAT codes read

Codes of the country pack with their rate, nature and declaration grids.

Integration tokens need the read ability.

Identifiant d'opération companies.vat-codes.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
allbooleanInclude the inactive codes.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma VatCode[]

Tableau de VatCode

Exemple
[
    {
        "id": 4,
        "company_id": 7,
        "code": "V21",
        "label": "Ventes 21 %",
        "direction": "sale",
        "rate": "21.00",
        "nature": "standard",
        "deductible_pct": "100.00",
        "base_grid": "03",
        "vat_grid": "54",
        "due_vat_grid": "string",
        "credit_base_grid": "49",
        "credit_vat_grid": "64",
        "vat_account": "451100",
        "due_vat_account": "string",
        "description": "Description",
        "is_active": true,
        "sort_order": 13,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/vat-codes/{vatCode}Activate or describe a VAT code write

Rates and grids are part of the country pack and cannot be edited.

Integration tokens need the write ability.

Identifiant d'opération companies.vat-codes.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
vatCode requisintegerId of the VAT code.
ex. 4

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • is_activeboolean
  • descriptionstring | null
Exemple
{
    "is_active": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma VatCode

Exemple
{
    "id": 4,
    "company_id": 7,
    "code": "V21",
    "label": "Ventes 21 %",
    "direction": "sale",
    "rate": "21.00",
    "nature": "standard",
    "deductible_pct": "100.00",
    "base_grid": "03",
    "vat_grid": "54",
    "due_vat_grid": "string",
    "credit_base_grid": "49",
    "credit_vat_grid": "64",
    "vat_account": "451100",
    "due_vat_account": "string",
    "description": "Description",
    "is_active": true,
    "sort_order": 13,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes/4" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_active": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes/4', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_active' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes/4", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_active": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-codes/4",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_active": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarationsVAT periods of a year read

Every period of the year with its declaration, or a computed preview when none exists yet.

Integration tokens need the read ability.

Identifiant d'opération companies.vat.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
yearintegerCurrent year by default.
ex. 2026

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • yearinteger
    ex. 2026
  • period_typestring
    monthly quarterly
  • periodsobject[]
    Propriétés
    • periodinteger
      ex. 1
    • labelstring
      ex. 1T 2026
    • starts_onstring <date>
    • ends_onstring <date>
    • declarationVatDeclaration | null
    • previewVatComputation | null
Exemple
{
    "year": 2026,
    "period_type": "monthly",
    "periods": [
        {
            "period": 1,
            "label": "1T 2026",
            "starts_on": "2026-03-15",
            "ends_on": "2026-03-15",
            "declaration": {
                "id": 14,
                "company_id": 7,
                "period_type": "monthly",
                "year": 2026,
                "period": 1,
                "starts_on": "2026-03-15T09:41:00+00:00",
                "ends_on": "2026-03-15T09:41:00+00:00",
                "grids": {
                    "00": "0.00",
                    "01": "0.00",
                    "02": "0.00",
                    "03": "1000.00",
                    "54": "210.00",
                    "59": "52.50",
                    "71": "157.50",
                    "72": "0.00",
                    "81": "0.00",
                    "82": "250.00",
                    "83": "0.00"
                },
                "amount_due": "157.50",
                "amount_refund": "0.00",
                "status": "draft",
                "validated_at": "2026-03-15T09:41:00+00:00",
                "validated_by": 1,
                "submitted_at": "2026-03-15T09:41:00+00:00",
                "submission_reference": "string",
                "journal_entry_id": 1284,
                "warnings": [
                    "string"
                ],
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "journal_entry": {}
            },
            "preview": {
                "grids": {
                    "00": "0.00",
                    "01": "0.00",
                    "02": "0.00",
                    "03": "1000.00",
                    "54": "210.00",
                    "59": "52.50",
                    "71": "157.50",
                    "72": "0.00",
                    "81": "0.00",
                    "82": "250.00",
                    "83": "0.00"
                },
                "amount_due": "157.50",
                "amount_refund": "0.00",
                "warnings": [
                    "string"
                ],
                "entries": 38
            }
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/vat-declarationsCreate or refresh a draft declaration write

Computes the grids of the period and stores them as a draft. Calling it again recomputes the draft.

Integration tokens need the write ability.

Identifiant d'opération companies.vat.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • yearintegerrequis
    2000 to 2100.
    ex. 2026
  • periodintegerrequis
    Month (1-12) or quarter (1-4) according to the VAT regime of the file.
    ex. 1
Exemple
{
    "year": 2026,
    "period": 1
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma VatDeclaration

Exemple
{
    "id": 14,
    "company_id": 7,
    "period_type": "monthly",
    "year": 2026,
    "period": 1,
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "status": "draft",
    "validated_at": "2026-03-15T09:41:00+00:00",
    "validated_by": 1,
    "submitted_at": "2026-03-15T09:41:00+00:00",
    "submission_reference": "string",
    "journal_entry_id": 1284,
    "warnings": [
        "string"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "year": 2026,
    "period": 1
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'year' => 2026,
        'period' => 1,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "year": 2026,
      "period": 1
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "year": 2026,
        "period": 1
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/previewCompute a VAT period read

Grids computed from the entries of the period, without saving anything.

Integration tokens need the read ability.

Identifiant d'opération companies.vat.preview

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
year requisinteger2000 to 2100.
ex. 2026
period requisintegerMonth (1-12) or quarter (1-4) according to the VAT regime of the file.
ex. 1

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object & VatComputation
  • starts_onstring <date>
  • ends_onstring <date>

Inclut VatComputation

Exemple
{
    "starts_on": "2026-03-15",
    "ends_on": "2026-03-15",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "warnings": [
        "string"
    ],
    "entries": 38
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/preview?year=2026&period=1" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/preview', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'year' => '2026',
        'period' => '1',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/preview?year=2026&period=1", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/preview",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "year": "2026",
        "period": "1"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/intracom-listingIntra-community listing read

Intra-EU supplies of goods and services per customer for the period. format=xml downloads the Intervat file.

Integration tokens need the read ability.

Identifiant d'opération companies.vat.intracom-listing

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
year requisinteger2000 to 2100.
ex. 2026
period requisintegerMonth (1-12) or quarter (1-4) according to the VAT regime of the file.
ex. 1
formatstring
xml

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • yearinteger
  • periodinteger
  • period_typestring
  • fromstring <date>
  • tostring <date>
  • clientsobject[]
    Propriétés
    • vat_numberstring
      ex. NL853746333B01
    • countrystring
      ex. NL
    • namestring
    • codestring
      L goods, S services, T triangular.
      ex. S
    • amountstring <decimal>
  • totalstring <decimal>
  • total_goodsstring <decimal>
  • total_servicesstring <decimal>
Exemple
{
    "year": 2026,
    "period": 3,
    "period_type": "string",
    "from": "2026-03-15",
    "to": "2026-03-15",
    "clients": [
        {
            "vat_number": "NL853746333B01",
            "country": "NL",
            "name": "Le Comptoir Montois SRL",
            "code": "S",
            "amount": "1210.00"
        }
    ],
    "total": "1210.00",
    "total_goods": "1210.00",
    "total_services": "1210.00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/intracom-listing?year=2026&period=1" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/intracom-listing', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'year' => '2026',
        'period' => '1',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/intracom-listing?year=2026&period=1", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/intracom-listing",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "year": "2026",
        "period": "1"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/client-listing/{year}Annual customer listing read

Belgian VAT-liable customers of the year with turnover and VAT; declare is true above the legal threshold of 250 EUR. format=xml downloads the Intervat file.

Integration tokens need the read ability.

Identifiant d'opération companies.vat.client-listing

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
year requisintegerCalendar year.
ex. 2026

Paramètres de requête

NomTypeDescription
formatstring
xml

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • yearinteger
    ex. 2026
  • clientsobject[]
    Propriétés
    • vat_numberstring
      ex. BE0403170701
    • namestring
      ex. ACME SA
    • turnovernumber
      ex. 18250
    • vatnumber
      ex. 3832.5
    • declareboolean
  • total_turnovernumber
  • total_vatnumber
Exemple
{
    "year": 2026,
    "clients": [
        {
            "vat_number": "BE0403170701",
            "name": "ACME SA",
            "turnover": 18250,
            "vat": 3832.5,
            "declare": true
        }
    ],
    "total_turnover": 12.5,
    "total_vat": 12.5
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/client-listing/2026" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/client-listing/2026', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/client-listing/2026", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/client-listing/2026",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/{vatDeclaration}VAT declaration read

With its settlement entry once validated.

Integration tokens need the read ability.

Identifiant d'opération companies.vat.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
vatDeclaration requisintegerId of the VAT declaration.
ex. 14

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma VatDeclaration

Exemple
{
    "id": 14,
    "company_id": 7,
    "period_type": "monthly",
    "year": 2026,
    "period": 1,
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "status": "draft",
    "validated_at": "2026-03-15T09:41:00+00:00",
    "validated_by": 1,
    "submitted_at": "2026-03-15T09:41:00+00:00",
    "submission_reference": "string",
    "journal_entry_id": 1284,
    "warnings": [
        "string"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/vat-declarations/{vatDeclaration}/validateValidate a declaration write

Freezes the grids and posts the VAT settlement entry (accounts of settings.auto_entries.vat). Emits the webhook vat.declaration_validated.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.vat.validate

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
vatDeclaration requisintegerId of the VAT declaration.
ex. 14

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma VatDeclaration

Exemple
{
    "id": 14,
    "company_id": 7,
    "period_type": "monthly",
    "year": 2026,
    "period": 1,
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "status": "draft",
    "validated_at": "2026-03-15T09:41:00+00:00",
    "validated_by": 1,
    "submitted_at": "2026-03-15T09:41:00+00:00",
    "submission_reference": "string",
    "journal_entry_id": 1284,
    "warnings": [
        "string"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/validate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/validate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/validate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/validate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/vat-declarations/{vatDeclaration}/submitMark a declaration as submitted write

Records the Intervat reference. NovaFisko does not file the declaration itself: download the XML and upload it on Intervat.

Integration tokens need the write ability.

Identifiant d'opération companies.vat.submit

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
vatDeclaration requisintegerId of the VAT declaration.
ex. 14

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • referencestring | null
    Intervat receipt reference.
Exemple
{
    "reference": "INTERVAT-2026-04-0098123"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma VatDeclaration

Exemple
{
    "id": 14,
    "company_id": 7,
    "period_type": "monthly",
    "year": 2026,
    "period": 1,
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "status": "draft",
    "validated_at": "2026-03-15T09:41:00+00:00",
    "validated_by": 1,
    "submitted_at": "2026-03-15T09:41:00+00:00",
    "submission_reference": "string",
    "journal_entry_id": 1284,
    "warnings": [
        "string"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entry": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/submit" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reference": "INTERVAT-2026-04-0098123"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/submit', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reference' => 'INTERVAT-2026-04-0098123',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/submit", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reference": "INTERVAT-2026-04-0098123"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/submit",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reference": "INTERVAT-2026-04-0098123"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/{vatDeclaration}/xmlIntervat XML of a declaration read

File ready to upload on Intervat (VATConsignment).

Integration tokens need the read ability.

Identifiant d'opération companies.vat.xml

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
vatDeclaration requisintegerId of the VAT declaration.
ex. 14

Entêtes communs : Accept-Language

Réponses

200Intervat XML file.

Entêtes de réponse Content-Disposition

application/xml

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/xml" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/xml', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/xml", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/14/xml",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Fixed assets

Fixed asset register, depreciation plans, bookings, disposals.

GET/v1/companies/{company}/fixed-assetsFixed asset register read

With the depreciation plan of each asset.

Integration tokens need the read ability.

Identifiant d'opération companies.fixed-assets.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma FixedAsset[]

Tableau de FixedAsset

Exemple
[
    {
        "id": 9,
        "company_id": 7,
        "source": "manual",
        "external_id": "string",
        "reference": "IMM-2026-003",
        "name": "Four mixte Rational",
        "category": "it_equipment",
        "asset_group": "string",
        "asset_account_id": 42,
        "depreciation_account_id": 42,
        "expense_account_id": 42,
        "imported_document_id": 42,
        "acquisition_date": "2026-02-01T00:00:00.000000Z",
        "acquisition_cost": "12400.00",
        "residual_value": "0.00",
        "useful_life_years": 5,
        "method": "linear",
        "prorata_temporis": true,
        "start_date": "2026-03-15T09:41:00+00:00",
        "status": "active",
        "notes": "string",
        "disposed_on": "2026-03-15T09:41:00+00:00",
        "disposal_price": "1210.00",
        "disposal_entry_id": 42,
        "investment_deduction_pct": "1210.00",
        "investment_deduction_spread": true,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "lines": [
            {
                "id": 42,
                "fixed_asset_id": 9,
                "year": 2026,
                "period_start": "2026-03-15T09:41:00+00:00",
                "period_end": "2026-03-15T09:41:00+00:00",
                "amount": "2269.37",
                "cumulative_amount": "2269.37",
                "remaining_value": "10130.63",
                "status": "planned",
                "journal_entry_id": 1284,
                "booked_amount": "0.00"
            }
        ],
        "asset_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "depreciation_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "expense_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        }
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fixed-assetsCreate a fixed asset write

Builds the depreciation plan (linear or declining, pro rata temporis) and resolves the asset, depreciation and expense accounts.

Integration tokens need the write ability.

Identifiant d'opération companies.fixed-assets.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • namestringrequis
  • referencestring | null
  • categorystringrequis
    it_equipment vehicle furniture machinery building software other
  • asset_groupstring | null
  • investment_deduction_pctnumber | null
    0 to 100.
  • investment_deduction_spreadboolean
  • asset_account_idinteger | null
    Class 2 account; resolved from the category when absent.
  • acquisition_datestring <date>requis
  • acquisition_coststringrequis
    Decimal, excl. VAT.
  • residual_valuestring | null
    Decimal.
  • useful_life_yearsintegerrequis
    1 to 50.
  • methodstring
    linear declining
  • prorata_temporisboolean
    True by default.
  • start_datestring <date> | null
    Start of the depreciation; the acquisition date by default.
  • notesstring | null
Exemple
{
    "name": "Four mixte Rational",
    "category": "machinery",
    "acquisition_date": "2026-02-01",
    "acquisition_cost": "12400.00",
    "useful_life_years": 5
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma FixedAsset

Exemple
{
    "id": 9,
    "company_id": 7,
    "source": "manual",
    "external_id": "string",
    "reference": "IMM-2026-003",
    "name": "Four mixte Rational",
    "category": "it_equipment",
    "asset_group": "string",
    "asset_account_id": 42,
    "depreciation_account_id": 42,
    "expense_account_id": 42,
    "imported_document_id": 42,
    "acquisition_date": "2026-02-01T00:00:00.000000Z",
    "acquisition_cost": "12400.00",
    "residual_value": "0.00",
    "useful_life_years": 5,
    "method": "linear",
    "prorata_temporis": true,
    "start_date": "2026-03-15T09:41:00+00:00",
    "status": "active",
    "notes": "string",
    "disposed_on": "2026-03-15T09:41:00+00:00",
    "disposal_price": "1210.00",
    "disposal_entry_id": 42,
    "investment_deduction_pct": "1210.00",
    "investment_deduction_spread": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "lines": [
        {
            "id": 42,
            "fixed_asset_id": 9,
            "year": 2026,
            "period_start": "2026-03-15T09:41:00+00:00",
            "period_end": "2026-03-15T09:41:00+00:00",
            "amount": "2269.37",
            "cumulative_amount": "2269.37",
            "remaining_value": "10130.63",
            "status": "planned",
            "journal_entry_id": 1284,
            "booked_amount": "0.00"
        }
    ],
    "asset_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "depreciation_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "expense_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "name": "Four mixte Rational",
    "category": "machinery",
    "acquisition_date": "2026-02-01",
    "acquisition_cost": "12400.00",
    "useful_life_years": 5
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'name' => 'Four mixte Rational',
        'category' => 'machinery',
        'acquisition_date' => '2026-02-01',
        'acquisition_cost' => '12400.00',
        'useful_life_years' => 5,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "name": "Four mixte Rational",
      "category": "machinery",
      "acquisition_date": "2026-02-01",
      "acquisition_cost": "12400.00",
      "useful_life_years": 5
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "name": "Four mixte Rational",
        "category": "machinery",
        "acquisition_date": "2026-02-01",
        "acquisition_cost": "12400.00",
        "useful_life_years": 5
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fixed-assets/groups/{fiscalYear}Depreciation table per group read

Acquisition cost, accumulated depreciation, depreciation of the year and net book value per group, for a fiscal year.

Integration tokens need the read ability.

Identifiant d'opération companies.fixed-assets.groups

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearstring
    ex. 2026
  • groupsobject[]
    Propriétés
    • groupstring
      ex. machinery
    • countinteger
      ex. 1
    • acquisition_coststring <decimal>
      ex. 12400.00
    • accumulatedstring <decimal>
      ex. 2269.37
    • net_book_valuestring <decimal>
      ex. 10130.63
    • year_depreciationstring <decimal>
      ex. 2269.37
    • investment_deductionstring <decimal>
      ex. 0.00
    • assetsobject[]
  • totalsobject
    Propriétés
    • acquisition_coststring <decimal>
    • accumulatedstring <decimal>
    • net_book_valuestring <decimal>
    • year_depreciationstring <decimal>
    • investment_deductionstring <decimal>
Exemple
{
    "fiscal_year": "2026",
    "groups": [
        {
            "group": "machinery",
            "count": 1,
            "acquisition_cost": "12400.00",
            "accumulated": "2269.37",
            "net_book_value": "10130.63",
            "year_depreciation": "2269.37",
            "investment_deduction": "0.00",
            "assets": [
                {}
            ]
        }
    ],
    "totals": {
        "acquisition_cost": "1210.00",
        "accumulated": "1210.00",
        "net_book_value": "1210.00",
        "year_depreciation": "1210.00",
        "investment_deduction": "1210.00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/groups/2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/groups/2', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/groups/2", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/groups/2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fixed-assets/{fixedAsset}Fixed asset read

Integration tokens need the read ability.

Identifiant d'opération companies.fixed-assets.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fixedAsset requisintegerId of the fixed asset.
ex. 9

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma FixedAsset

Exemple
{
    "id": 9,
    "company_id": 7,
    "source": "manual",
    "external_id": "string",
    "reference": "IMM-2026-003",
    "name": "Four mixte Rational",
    "category": "it_equipment",
    "asset_group": "string",
    "asset_account_id": 42,
    "depreciation_account_id": 42,
    "expense_account_id": 42,
    "imported_document_id": 42,
    "acquisition_date": "2026-02-01T00:00:00.000000Z",
    "acquisition_cost": "12400.00",
    "residual_value": "0.00",
    "useful_life_years": 5,
    "method": "linear",
    "prorata_temporis": true,
    "start_date": "2026-03-15T09:41:00+00:00",
    "status": "active",
    "notes": "string",
    "disposed_on": "2026-03-15T09:41:00+00:00",
    "disposal_price": "1210.00",
    "disposal_entry_id": 42,
    "investment_deduction_pct": "1210.00",
    "investment_deduction_spread": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "lines": [
        {
            "id": 42,
            "fixed_asset_id": 9,
            "year": 2026,
            "period_start": "2026-03-15T09:41:00+00:00",
            "period_end": "2026-03-15T09:41:00+00:00",
            "amount": "2269.37",
            "cumulative_amount": "2269.37",
            "remaining_value": "10130.63",
            "status": "planned",
            "journal_entry_id": 1284,
            "booked_amount": "0.00"
        }
    ],
    "asset_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "depreciation_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "expense_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/fixed-assets/{fixedAsset}Update a fixed asset write

The plan is rebuilt for the years not booked yet.

Integration tokens need the write ability.

Identifiant d'opération companies.fixed-assets.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fixedAsset requisintegerId of the fixed asset.
ex. 9

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • namestring
  • categorystring
    it_equipment vehicle furniture machinery building software other
  • asset_groupstring | null
  • investment_deduction_pctnumber | null
  • investment_deduction_spreadboolean
  • asset_account_idinteger | null
  • residual_valuestring
  • useful_life_yearsinteger
  • methodstring
    linear declining
  • prorata_temporisboolean
  • statusstring
    active fully_depreciated disposed
  • notesstring | null
Exemple
{
    "useful_life_years": 7
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma FixedAsset

Exemple
{
    "id": 9,
    "company_id": 7,
    "source": "manual",
    "external_id": "string",
    "reference": "IMM-2026-003",
    "name": "Four mixte Rational",
    "category": "it_equipment",
    "asset_group": "string",
    "asset_account_id": 42,
    "depreciation_account_id": 42,
    "expense_account_id": 42,
    "imported_document_id": 42,
    "acquisition_date": "2026-02-01T00:00:00.000000Z",
    "acquisition_cost": "12400.00",
    "residual_value": "0.00",
    "useful_life_years": 5,
    "method": "linear",
    "prorata_temporis": true,
    "start_date": "2026-03-15T09:41:00+00:00",
    "status": "active",
    "notes": "string",
    "disposed_on": "2026-03-15T09:41:00+00:00",
    "disposal_price": "1210.00",
    "disposal_entry_id": 42,
    "investment_deduction_pct": "1210.00",
    "investment_deduction_spread": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "lines": [
        {
            "id": 42,
            "fixed_asset_id": 9,
            "year": 2026,
            "period_start": "2026-03-15T09:41:00+00:00",
            "period_end": "2026-03-15T09:41:00+00:00",
            "amount": "2269.37",
            "cumulative_amount": "2269.37",
            "remaining_value": "10130.63",
            "status": "planned",
            "journal_entry_id": 1284,
            "booked_amount": "0.00"
        }
    ],
    "asset_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "depreciation_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "expense_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "useful_life_years": 7
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'useful_life_years' => 7,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "useful_life_years": 7
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "useful_life_years": 7
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fixed-assets/book-period/{fiscalYear}Book the depreciation of a period write

One miscellaneous entry for every asset, for a month of the fiscal year. 200 with entry: null when there is nothing to book.

Integration tokens need the write ability.

Identifiant d'opération companies.fixed-assets.book-period

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • period_numberintegerrequis
    1 to 12.
Exemple
{
    "period_number": 3
}

Réponses

200Nothing to book

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
Exemple
{
    "entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    },
    "period": "Mars 2026"
}
201Depreciation booked

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
Exemple
{
    "entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    },
    "period": "Mars 2026"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/book-period/2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "period_number": 3
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/book-period/2', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'period_number' => 3,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/book-period/2", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "period_number": 3
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/book-period/2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "period_number": 3
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fixed-assets/{fixedAsset}/book/{fiscalYear}Book the yearly depreciation of an asset write

Miscellaneous entry 6302 / 2x09 for the fiscal year.

Integration tokens need the write ability.

Error codes (code):

  • period_locked: the period is locked or the fiscal year is closed; reason tells which (period_locked or fiscal_year_closed)

Identifiant d'opération companies.fixed-assets.book

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fixedAsset requisintegerId of the fixed asset.
ex. 9
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma FixedAsset

Exemple
{
    "id": 9,
    "company_id": 7,
    "source": "manual",
    "external_id": "string",
    "reference": "IMM-2026-003",
    "name": "Four mixte Rational",
    "category": "it_equipment",
    "asset_group": "string",
    "asset_account_id": 42,
    "depreciation_account_id": 42,
    "expense_account_id": 42,
    "imported_document_id": 42,
    "acquisition_date": "2026-02-01T00:00:00.000000Z",
    "acquisition_cost": "12400.00",
    "residual_value": "0.00",
    "useful_life_years": 5,
    "method": "linear",
    "prorata_temporis": true,
    "start_date": "2026-03-15T09:41:00+00:00",
    "status": "active",
    "notes": "string",
    "disposed_on": "2026-03-15T09:41:00+00:00",
    "disposal_price": "1210.00",
    "disposal_entry_id": 42,
    "investment_deduction_pct": "1210.00",
    "investment_deduction_spread": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "lines": [
        {
            "id": 42,
            "fixed_asset_id": 9,
            "year": 2026,
            "period_start": "2026-03-15T09:41:00+00:00",
            "period_end": "2026-03-15T09:41:00+00:00",
            "amount": "2269.37",
            "cumulative_amount": "2269.37",
            "remaining_value": "10130.63",
            "status": "planned",
            "journal_entry_id": 1284,
            "booked_amount": "0.00"
        }
    ],
    "asset_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "depreciation_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "expense_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed, or the write was refused because its period is locked or its fiscal year is closed (code: period_locked, with reason). PeriodLockedError

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/book/2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/book/2', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/book/2", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/book/2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/fixed-assets/{fixedAsset}/disposeDispose of an asset write

Sale (price above 0) or scrapping (price 0): posts the disposal entry with the gain or loss.

Integration tokens need the write ability.

Identifiant d'opération companies.fixed-assets.dispose

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fixedAsset requisintegerId of the fixed asset.
ex. 9

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • datestring <date>requis
  • sale_pricestring | null
    Decimal, excl. VAT.
  • labelstring | null
Exemple
{
    "date": "2026-09-30",
    "sale_price": "4500.00"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
Exemple
{
    "asset": {
        "id": 9,
        "company_id": 7,
        "source": "manual",
        "external_id": "string",
        "reference": "IMM-2026-003",
        "name": "Four mixte Rational",
        "category": "it_equipment",
        "asset_group": "string",
        "asset_account_id": 42,
        "depreciation_account_id": 42,
        "expense_account_id": 42,
        "imported_document_id": 42,
        "acquisition_date": "2026-02-01T00:00:00.000000Z",
        "acquisition_cost": "12400.00",
        "residual_value": "0.00",
        "useful_life_years": 5,
        "method": "linear",
        "prorata_temporis": true,
        "start_date": "2026-03-15T09:41:00+00:00",
        "status": "active",
        "notes": "string",
        "disposed_on": "2026-03-15T09:41:00+00:00",
        "disposal_price": "1210.00",
        "disposal_entry_id": 42,
        "investment_deduction_pct": "1210.00",
        "investment_deduction_spread": true,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1,
        "lines": [
            {
                "id": 42,
                "fixed_asset_id": 9,
                "year": 2026,
                "period_start": "2026-03-15T09:41:00+00:00",
                "period_end": "2026-03-15T09:41:00+00:00",
                "amount": "2269.37",
                "cumulative_amount": "2269.37",
                "remaining_value": "10130.63",
                "status": "planned",
                "journal_entry_id": 1284,
                "booked_amount": "0.00"
            }
        ],
        "asset_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "depreciation_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        },
        "expense_account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        }
    },
    "entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/dispose" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "date": "2026-09-30",
    "sale_price": "4500.00"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/dispose', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'date' => '2026-09-30',
        'sale_price' => '4500.00',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/dispose", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "date": "2026-09-30",
      "sale_price": "4500.00"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/9/dispose",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "date": "2026-09-30",
        "sale_price": "4500.00"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Reports

Trial balance, general ledger, balance sheet and income statement, third party and aged balances.

GET/v1/companies/{company}/journals/{journal}/entriesEntries of a journal read

Full entries of the journal over a date range, in number order (journal book).

Integration tokens need the read ability.

Identifiant d'opération companies.reports.journal

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
journal requisintegerId of the journal.
ex. 3

Paramètres de requête

NomTypeDescription
fromstring <date>
tostring <date>

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma JournalEntry[]

Tableau de JournalEntry

Exemple
[
    {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3/entries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3/entries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3/entries", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/3/entries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/trial-balanceTrial balance read

Integration tokens need the read ability.

Identifiant d'opération companies.reports.trial-balance

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
fromstring <date>
tostring <date>
include_emptybooleanInclude the accounts without movement.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearstring
    ex. 2026
  • fromstring <date>
  • tostring <date>
  • linesobject[]
    Propriétés
    • account_idinteger
      ex. 223
    • numberstring
      ex. 400000
    • labelstring
      ex. Clients
    • typestring
      ex. asset
    • debitstring <decimal>
      ex. 1210.00
    • creditstring <decimal>
      ex. 0.00
    • debit_balancestring <decimal>
      ex. 1210.00
    • credit_balancestring <decimal>
      ex. 0.00
    • balancestring <decimal>
      ex. 1210.00
  • totalsobject
    Propriétés
    • debitstring <decimal>
      ex. 1512.50
    • creditstring <decimal>
      ex. 1512.50
    • is_balancedboolean
    • resultstring <decimal>
      Result of the period.
      ex. 750.00
Exemple
{
    "fiscal_year": "2026",
    "from": "2026-03-15",
    "to": "2026-03-15",
    "lines": [
        {
            "account_id": 223,
            "number": "400000",
            "label": "Clients",
            "type": "asset",
            "debit": "1210.00",
            "credit": "0.00",
            "debit_balance": "1210.00",
            "credit_balance": "0.00",
            "balance": "1210.00"
        }
    ],
    "totals": {
        "debit": "1512.50",
        "credit": "1512.50",
        "is_balanced": true,
        "result": "750.00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/trial-balance" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/trial-balance', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/trial-balance", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/trial-balance",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/balance-by-periodBalance by period read

One column per period of the fiscal year.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.balance-by-period

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearstring
    ex. 2026
  • periodsobject[]
    Propriétés
    • idinteger
    • numberinteger
    • labelstring
      ex. Janvier 2026
    • is_lockedboolean
  • accountsobject[]
    Propriétés
    • account_idinteger
      ex. 223
    • numberstring
      ex. 400000
    • labelstring
      ex. Clients
    • typestring
      ex. asset
    • periodsstring <decimal>[]
    • totalstring <decimal>
Exemple
{
    "fiscal_year": "2026",
    "periods": [
        {
            "id": 42,
            "number": 412,
            "label": "Janvier 2026",
            "is_locked": false
        }
    ],
    "accounts": [
        {
            "account_id": 223,
            "number": "400000",
            "label": "Clients",
            "type": "asset",
            "periods": [
                "1210.00"
            ],
            "total": "1210.00"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/balance-by-period" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/balance-by-period', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/balance-by-period", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/balance-by-period",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/financial-statementsBalance sheet and income statement read

Belgian legal scheme (BNB / NBB headings), in real time.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.financial-statements

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
tostring <date>Situation at this date.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearstring
    ex. 2026
  • tostring <date>
  • schemestring
    ex. BE
  • balance_sheetobject[]
    Propriétés
    • codestring
      ex. 20/28
    • labelstring
      ex. ACTIFS IMMOBILISÉS
    • sidestring
      asset liability
    • groupboolean
    • amountstring <decimal> | null
  • totalsobject
    Propriétés
    • assetsstring <decimal>
      ex. 1262.50
    • liabilitiesstring <decimal>
      ex. 1262.50
    • is_balancedboolean
  • income_statementobject[]
    Propriétés
    • codestring
      ex. 70
    • labelstring
      ex. Chiffre d'affaires
    • sidestring
      income expense
    • detailboolean
    • amountstring <decimal>
      ex. 1000.00
  • resultstring <decimal>
    ex. 750.00
Exemple
{
    "fiscal_year": "2026",
    "to": "2026-03-15",
    "scheme": "BE",
    "balance_sheet": [
        {
            "code": "20/28",
            "label": "ACTIFS IMMOBILISÉS",
            "side": "asset",
            "group": true,
            "amount": "1210.00"
        }
    ],
    "totals": {
        "assets": "1262.50",
        "liabilities": "1262.50",
        "is_balanced": true
    },
    "income_statement": [
        {
            "code": "70",
            "label": "Chiffre d'affaires",
            "side": "income",
            "detail": true,
            "amount": "1000.00"
        }
    ],
    "result": "750.00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/financial-statements" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/financial-statements', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/financial-statements", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/financial-statements",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/general-ledger/{account}General ledger of an account read

Movements of one account with the running balance.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.general-ledger

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2
account requisintegerId of the account (not its number).
ex. 223

Paramètres de requête

NomTypeDescription
fromstring <date>
tostring <date>

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • account_idinteger
    ex. 223
  • fromstring <date>
  • tostring <date>
  • opening_balancestring <decimal>
    ex. 0.00
  • movementsobject[]
    Propriétés
    • line_idinteger
    • entry_idinteger
    • entry_datestring <date>
    • journalstring
      ex. VEN
    • documentstring
      ex. 2026/000412
    • labelstring | null
    • referencestring | null
    • third_partystring | null
    • debitstring <decimal>
    • creditstring <decimal>
    • balancestring <decimal>
    • reconciliation_codestring | null
  • totalsobject
    Propriétés
    • debitstring <decimal>
    • creditstring <decimal>
    • balancestring <decimal>
Exemple
{
    "account_id": 223,
    "from": "2026-03-15",
    "to": "2026-03-15",
    "opening_balance": "0.00",
    "movements": [
        {
            "line_id": 3391,
            "entry_id": 1284,
            "entry_date": "2026-03-15",
            "journal": "VEN",
            "document": "2026/000412",
            "label": "Facture Brasserie Dubuisson",
            "reference": "F-2026-0412",
            "third_party": "string",
            "debit": "1210.00",
            "credit": "0.00",
            "balance": "1210.00",
            "reconciliation_code": "string"
        }
    ],
    "totals": {
        "debit": "1210.00",
        "credit": "0.00",
        "balance": "1210.00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/general-ledger/223" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/general-ledger/223', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/general-ledger/223", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/general-ledger/223",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/consistencyConsistency of the fiscal year read

Gaps in the numbering, entries whose period does not match their date, entries outside the fiscal year.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.consistency

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • fiscal_yearstring
    ex. 2026
  • missing_numbersobject[]
  • period_mismatchesobject[]
  • entries_outside_fiscal_yearinteger
    ex. 0
  • is_consistentboolean
Exemple
{
    "fiscal_year": "2026",
    "missing_numbers": [
        {}
    ],
    "period_mismatches": [
        {}
    ],
    "entries_outside_fiscal_year": 0,
    "is_consistent": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/consistency" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/consistency', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/consistency", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/consistency",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-party-balance/{type}Customer or supplier balance read

Integration tokens need the read ability.

Identifiant d'opération companies.reports.third-party-balance

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringSide of the balance.
customer supplier

Paramètres de requête

NomTypeDescription
tostring <date>

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object[]

Tableau de

  • third_party_idinteger
  • codestring
    ex. ACME
  • namestring
    ex. ACME SA
  • debitstring <decimal>
  • creditstring <decimal>
  • outstandingstring <decimal>
    ex. 1210.00
  • open_itemsinteger
    ex. 1
Exemple
[
    {
        "third_party_id": 18,
        "code": "ACME",
        "name": "ACME SA",
        "debit": "1210.00",
        "credit": "0.00",
        "outstanding": "1210.00",
        "open_items": 1
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-party-balance/customer" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-party-balance/customer', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-party-balance/customer", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-party-balance/customer",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/aged-balance/{type}Aged balance read

Open amounts per third party, split by age: not due, 1-30, 31-60, 61-90 and more than 90 days.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.aged-balance

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringSide of the balance.
customer supplier

Paramètres de requête

NomTypeDescription
tostring <date>Today by default.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • typestring
    ex. customer
  • tostring <date>
  • rowsobject[]
    Propriétés
    • third_party_idinteger
    • codestring
    • namestring
    • totalstring <decimal>
    • currentstring <decimal>
    • d30string <decimal>
    • d60string <decimal>
    • d90string <decimal>
    • d90plusstring <decimal>
  • totalsobject
    Propriétés
    • currentstring <decimal>
    • d30string <decimal>
    • d60string <decimal>
    • d90string <decimal>
    • d90plusstring <decimal>
    • totalstring <decimal>
Exemple
{
    "type": "customer",
    "to": "2026-03-15",
    "rows": [
        {
            "third_party_id": 18,
            "code": "COMPTOIR",
            "name": "Le Comptoir Montois SRL",
            "total": "1210.00",
            "current": "1210.00",
            "d30": "1210.00",
            "d60": "1210.00",
            "d90": "1210.00",
            "d90plus": "1210.00"
        }
    ],
    "totals": {
        "current": "1210.00",
        "d30": "1210.00",
        "d60": "1210.00",
        "d90": "1210.00",
        "d90plus": "1210.00",
        "total": "1210.00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/aged-balance/customer" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/aged-balance/customer', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/aged-balance/customer", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/aged-balance/customer",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Analytics & budgets

Analytic codes, analytic report, budgets.

GET/v1/companies/{company}/analytic-codesAnalytic codes read

Integration tokens need the read ability.

Identifiant d'opération companies.analytic-codes.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
axisstring
cost_center project

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma AnalyticCode[]

Tableau de AnalyticCode

Exemple
[
    {
        "id": 2,
        "company_id": 7,
        "axis": "cost_center",
        "code": "SALLE",
        "label": "Salle",
        "is_active": true,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "deleted_by": 1
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/analytic-codesCreate an analytic code write

Integration tokens need the write ability.

Identifiant d'opération companies.analytic-codes.store

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • axisstringrequis
    cost_center project
  • codestringrequis
    Unique per axis, 20 max.
  • labelstringrequis
  • is_activeboolean
Exemple
{
    "axis": "cost_center",
    "code": "SALLE",
    "label": "Salle"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma AnalyticCode

Exemple
{
    "id": 2,
    "company_id": 7,
    "axis": "cost_center",
    "code": "SALLE",
    "label": "Salle",
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "axis": "cost_center",
    "code": "SALLE",
    "label": "Salle"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'axis' => 'cost_center',
        'code' => 'SALLE',
        'label' => 'Salle',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "axis": "cost_center",
      "code": "SALLE",
      "label": "Salle"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "axis": "cost_center",
        "code": "SALLE",
        "label": "Salle"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/analytic-codes/{analyticCode}Update an analytic code write

Integration tokens need the write ability.

Identifiant d'opération companies.analytic-codes.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
analyticCode requisintegerId of the analytic code.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • labelstring
  • is_activeboolean
Exemple
{
    "is_active": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma AnalyticCode

Exemple
{
    "id": 2,
    "company_id": 7,
    "axis": "cost_center",
    "code": "SALLE",
    "label": "Salle",
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "is_active": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/2', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'is_active' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/2", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "is_active": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "is_active": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/analytic-reportAnalytic report read

Expenses, income and result per analytic code.

Integration tokens need the read ability.

Identifiant d'opération companies.reports.analytic

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
axisstring
cost_center project
fromstring <date>
tostring <date>

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • axisstring
  • fiscal_yearstring
  • groupsobject[]
    Propriétés
    • codestring | null
      ex. SALLE
    • labelstring | null
    • expensesstring <decimal>
    • incomestring <decimal>
    • resultstring <decimal>
    • accountsobject[]
      Propriétés
      • account_idinteger
        ex. 223
      • numberstring
        ex. 400000
      • labelstring
        ex. Clients
      • typestring
        ex. asset
      • amountstring <decimal>
Exemple
{
    "axis": "string",
    "fiscal_year": "string",
    "groups": [
        {
            "code": "SALLE",
            "label": "Facture Brasserie Dubuisson",
            "expenses": "1210.00",
            "income": "1210.00",
            "result": "1210.00",
            "accounts": [
                {
                    "account_id": 223,
                    "number": "400000",
                    "label": "Clients",
                    "type": "asset",
                    "amount": "1210.00"
                }
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/analytic-report" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/analytic-report', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/analytic-report", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/analytic-report",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/budgetsBudget cells read

Integration tokens need the read ability.

Identifiant d'opération companies.budgets.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
scenariostringdefault when absent.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Budget[]

Tableau de Budget

Exemple
[
    {
        "id": 42,
        "company_id": 7,
        "fiscal_year_id": 2,
        "scenario": "default",
        "account_id": 580,
        "cost_center_id": 42,
        "period_number": 3,
        "amount": "1500.00",
        "account": {
            "id": 580,
            "number": "702000",
            "label": "Prestations de services"
        }
    }
]
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PUT/v1/companies/{company}/fiscal-years/{fiscalYear}/budgetsSave budget cells write

Batch of cells (account × period, optionally × cost centre). An amount of 0 deletes the cell; spread_yearly spreads a yearly amount over twelve months.

Integration tokens need the write ability.

Identifiant d'opération companies.budgets.save

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • scenariostring
  • cellsobject[]requis
    Propriétés
    • account_idintegerrequis
    • cost_center_idinteger | null
    • period_numberintegerrequis
      1 to 12.
    • amountstringrequis
      Decimal.
  • spread_yearlyboolean
Exemple
{
    "cells": [
        {
            "account_id": 378,
            "period_number": 1,
            "amount": "18000.00"
        }
    ],
    "spread_yearly": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • savedinteger
    ex. 1
Exemple
{
    "saved": 1
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PUT "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "cells": [
        {
            "account_id": 378,
            "period_number": 1,
            "amount": "18000.00"
        }
    ],
    "spread_yearly": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'cells' => [
            [
                'account_id' => 378,
                'period_number' => 1,
                'amount' => '18000.00',
            ],
        ],
        'spread_yearly' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets", {
  method: "PUT",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "cells": [
          {
              "account_id": 378,
              "period_number": 1,
              "amount": "18000.00"
          }
      ],
      "spread_yearly": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.put(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budgets",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "cells": [
            {
                "account_id": 378,
                "period_number": 1,
                "amount": "18000.00"
            }
        ],
        "spread_yearly": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fiscal-years/{fiscalYear}/budget-reportBudget against actuals read

Integration tokens need the read ability.

Identifiant d'opération companies.reports.budget

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
scenariostring
cost_center_idinteger
upto_periodinteger1 to 12.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • scenariostring
  • fiscal_yearstring
  • upto_periodinteger
  • linesobject[]
    Propriétés
    • account_idinteger
      ex. 223
    • numberstring
      ex. 400000
    • labelstring
      ex. Clients
    • typestring
      ex. asset
    • budgetobject
      Period number => amount.
    • actualobject
      Period number => amount.
    • budget_ytdstring <decimal>
    • actual_ytdstring <decimal>
    • variancestring <decimal>
    • variance_pctnumber | null
    • budget_yearstring <decimal>
  • totalsobject
    Propriétés
    • expenses_minus_income_budgetstring <decimal>
    • expenses_minus_income_actualstring <decimal>
Exemple
{
    "scenario": "string",
    "fiscal_year": "string",
    "upto_period": 1,
    "lines": [
        {
            "account_id": 223,
            "number": "400000",
            "label": "Clients",
            "type": "asset",
            "budget": {},
            "actual": {},
            "budget_ytd": "1210.00",
            "actual_ytd": "1210.00",
            "variance": "1210.00",
            "variance_pct": 12.5,
            "budget_year": "1210.00"
        }
    ],
    "totals": {
        "expenses_minus_income_budget": "1210.00",
        "expenses_minus_income_actual": "1210.00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budget-report" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budget-report', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budget-report", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fiscal-years/2/budget-report",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Exports

Legal books, statements and data as PDF, XLSX or CSV; full dossier as ZIP.

GET/v1/companies/{company}/exportsCatalogue of exports read

Every export with its group, formats and parameters. types keeps the historical list of CSV codes.

Integration tokens need the read ability.

Identifiant d'opération companies.exports.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • typesstring[]
  • formatsstring[]
    pdf xlsx csv
  • default_formatstring
    ex. csv
  • full_dossierstring
    ex. zip
  • groupsobject[]
    Propriétés
    • codestring
      books statements vat third_parties assets data
    • labelstring
      ex. Livres comptables
  • common_paramsstring[]
  • catalogobject[]
    Propriétés
    • codestring
      ex. general-ledger
    • labelstring
      ex. Grand livre
    • descriptionstring
    • groupstring
      ex. books
    • group_labelstring
    • formatsstring[]
    • datedboolean
    • requires_fiscal_yearboolean
    • paramsobject[]
Exemple
{
    "types": [
        "string"
    ],
    "formats": [
        "pdf"
    ],
    "default_format": "csv",
    "full_dossier": "zip",
    "groups": [
        {
            "code": "books",
            "label": "Livres comptables"
        }
    ],
    "common_params": [
        "string"
    ],
    "catalog": [
        {
            "code": "general-ledger",
            "label": "Grand livre",
            "description": "Description",
            "group": "books",
            "group_label": "string",
            "formats": [
                "string"
            ],
            "dated": true,
            "requires_fiscal_year": true,
            "params": [
                {}
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/exports/full-dossier/{fiscalYear}Full dossier (ZIP) read 10 / 1 min

Every book, statement, VAT document, third party listing, fixed asset table and the source documents of the fiscal year, in numbered folders with a manifest of SHA-256 fingerprints.

Integration tokens need the read ability.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.exports.full-dossier

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
fiscalYear requisintegerId of the fiscal year.
ex. 2

Paramètres de requête

NomTypeDescription
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200ZIP archive.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

application/zip

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/full-dossier/2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/full-dossier/2', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/full-dossier/2", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/full-dossier/2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/exports/{type}/preview-urlSigned preview URL of an export read 60 / 1 min

URL valid 15 minutes that serves the PDF inline (preview pane).

Integration tokens need the read ability.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.exports.preview-url

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringExport code from the catalogue of GET exports (journals, general-ledger, trial-balance, vat-declaration, …).
ex. trial-balance

Paramètres de requête

NomTypeDescription
fiscal_year_idintegerThe current fiscal year when absent.
fromstring <date>
tostring <date>
langstring
fr nl en de
account_fromstringgeneral-ledger.
account_tostringgeneral-ledger.
schemestringannual-accounts.
abbreviated micro
general_meeting_datestring <date>annual-accounts.
declaration_idintegervat-declaration.
yearintegerintracom-listing.
periodintegerintracom-listing.
third_party_idintegerthird-party-ledger.
party_typestringthird-party-ledger.
customer supplier

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • urlstring <uri>
  • expires_ininteger
    Seconds.
    ex. 900
  • formatstring
    ex. pdf
Exemple
{
    "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "expires_in": 900,
    "format": "pdf"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/preview-url" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/preview-url', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/preview-url", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/preview-url",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/exports/{type}Download an export read 30 / 1 min

Codes: journals, purchases, sales, financial, miscellaneous, general-ledger, trial-balance, balance-by-period, financial-statements, annual-accounts, vat-summary, vat-declaration, customer-listing, intracom-listing, third-parties, customer-balance, supplier-balance, aged-customers, aged-suppliers, third-party-ledger, fixed-assets, accounts, documents, audit-trail. Generation is synchronous. PDFs of a period that is not locked carry a « provisional » mention.

Integration tokens need the read ability.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.exports.download

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringExport code from the catalogue of GET exports (journals, general-ledger, trial-balance, vat-declaration, …).
ex. trial-balance

Paramètres de requête

NomTypeDescription
formatstringCSV by default.
pdf xlsx csv
fiscal_year_idintegerThe current fiscal year when absent.
fromstring <date>
tostring <date>
langstring
fr nl en de
account_fromstringgeneral-ledger.
account_tostringgeneral-ledger.
schemestringannual-accounts.
abbreviated micro
general_meeting_datestring <date>annual-accounts.
declaration_idintegervat-declaration.
yearintegerintracom-listing.
periodintegerintracom-listing.
third_party_idintegerthird-party-ledger.
party_typestringthird-party-ledger.
customer supplier

Entêtes communs : Accept-Language

Réponses

200The file.

Entêtes de réponse Content-Disposition X-Export-Fingerprint X-RateLimit-Limit X-RateLimit-Remaining

application/pdf

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

text/csv

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/exports/{type}/viewInline PDF of an export (signed) URL signée 30 / 1 min

Target of the URL returned by preview-url.

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération exports.view

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringExport code from the catalogue of GET exports (journals, general-ledger, trial-balance, vat-declaration, …).
ex. trial-balance

Entêtes communs : signature expires

Réponses

200The PDF, inline.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

application/pdf

403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/view" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/view', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/view", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/exports/trial-balance/view",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Peppol

Registration of a company file on Peppol, transport options, network lookups.

GET/v1/companies/{company}/peppolPeppol state of the file read

Registration, transport options, SMP publication, supported documents and what blocks a registration.

Integration tokens need the read ability.

Identifiant d'opération companies.peppol.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/peppolUnregister the file from Peppol write Hors démo

Archives the account at the access point and records the reason.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération companies.peppol.destroy

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • reason_typestringrequis
    expensive accountant other
  • custom_reasonstring | null
    Required when the reason is other.
Exemple
{
    "reason_type": "accountant"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-Trashed

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Refused: missing data on the file, provider error or not registered. blocker_codes lists the machine reasons and state carries the current Peppol state.

application/json

Schéma Error & object

Inclut Error

Exemple
{
    "message": "Le numéro de TVA du dossier est requis pour l'inscription Peppol.",
    "errors": {
        "peppol": [
            "Le numéro de TVA du dossier est requis pour l'inscription Peppol."
        ]
    },
    "blockers": [
        "Numéro de TVA manquant"
    ],
    "blocker_codes": [
        "missing_vat_number"
    ]
}

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reason_type": "accountant"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reason_type' => 'accountant',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reason_type": "accountant"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reason_type": "accountant"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/peppol/registerRegister the file on Peppol write Hors démo 6 / 1 min

Creates the account at the access point (B2Brouter) and publishes the participant 0208:<enterprise number>. 201 for a new registration, 200 when it was already active. Emits the webhook peppol.status_changed.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 6 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.peppol.register

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • emailstring <email> | null
    Contact of the registration.
  • phonestring | null
  • addressstring | null
  • postal_codestring | null
  • citystring | null
  • provincestring | null
  • optionsobject
    Propriétés
    • round_before_sumboolean | null
    • apply_taxes_per_lineboolean | null
    • registered_for_empl_taxboolean | null
Exemple
{
    "email": "gerant@comptoir-montois.example",
    "address": "Grand-Place 14",
    "postal_code": "7000",
    "city": "Mons"
}

Réponses

200Already registered

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
201Registered

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Refused: missing data on the file, provider error or not registered. blocker_codes lists the machine reasons and state carries the current Peppol state.

application/json

Schéma Error & object

Inclut Error

Exemple
{
    "message": "Le numéro de TVA du dossier est requis pour l'inscription Peppol.",
    "errors": {
        "peppol": [
            "Le numéro de TVA du dossier est requis pour l'inscription Peppol."
        ]
    },
    "blockers": [
        "Numéro de TVA manquant"
    ],
    "blocker_codes": [
        "missing_vat_number"
    ]
}
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/register" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "email": "gerant@comptoir-montois.example",
    "address": "Grand-Place 14",
    "postal_code": "7000",
    "city": "Mons"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/register', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'email' => 'gerant@comptoir-montois.example',
        'address' => 'Grand-Place 14',
        'postal_code' => '7000',
        'city' => 'Mons',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/register", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "email": "gerant@comptoir-montois.example",
      "address": "Grand-Place 14",
      "postal_code": "7000",
      "city": "Mons"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/register",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "email": "gerant@comptoir-montois.example",
        "address": "Grand-Place 14",
        "postal_code": "7000",
        "city": "Mons"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/peppol/refreshRefresh the Peppol state write Hors démo 12 / 1 min

Reads the account at the access point and the network (SML / SMP) again.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 12 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.peppol.refresh

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Refused: missing data on the file, provider error or not registered. blocker_codes lists the machine reasons and state carries the current Peppol state.

application/json

Schéma Error & object

Inclut Error

Exemple
{
    "message": "Le numéro de TVA du dossier est requis pour l'inscription Peppol.",
    "errors": {
        "peppol": [
            "Le numéro de TVA du dossier est requis pour l'inscription Peppol."
        ]
    },
    "blockers": [
        "Numéro de TVA manquant"
    ],
    "blocker_codes": [
        "missing_vat_number"
    ]
}
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/refresh" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/refresh', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/refresh", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/refresh",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/peppol/transportUpdate the transport options write Hors démo

Reception and the document families received through Peppol.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération companies.peppol.transport

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • enabledboolean | null
  • receptionboolean | null
  • standard_documentsboolean | null
  • invoiceboolean | null
  • credit_noteboolean | null
  • self_billingboolean | null
  • orderboolean | null
  • application_responseboolean | null
Exemple
{
    "reception": true,
    "credit_note": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma PeppolState

Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Refused: missing data on the file, provider error or not registered. blocker_codes lists the machine reasons and state carries the current Peppol state.

application/json

Schéma Error & object

Inclut Error

Exemple
{
    "message": "Le numéro de TVA du dossier est requis pour l'inscription Peppol.",
    "errors": {
        "peppol": [
            "Le numéro de TVA du dossier est requis pour l'inscription Peppol."
        ]
    },
    "blockers": [
        "Numéro de TVA manquant"
    ],
    "blocker_codes": [
        "missing_vat_number"
    ]
}

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/transport" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reception": true,
    "credit_note": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/transport', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reception' => true,
        'credit_note' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/transport", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reception": true,
      "credit_note": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/transport",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reception": True,
        "credit_note": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/peppol/lookupLook a participant up on the Peppol network read Hors démo 30 / 1 min

By identifier (0208:0402531376) or by VAT / enterprise number and country. Reads the SML and the SMP of the participant.

Integration tokens need the read ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.peppol.lookup

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
identifierstring
ex. 0208:0402531376
vatstring
ex. BE0402531376
countrystring
ex. BE
enterprise_numberstring

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PeppolThirdPartyStatus

Exemple
{
    "identifier": "0208:0402531376",
    "registered": true,
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "checked_at": "2026-03-15T09:41:00+00:00",
    "stale": true,
    "error": "string",
    "source": "sml+smp"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/lookup" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/lookup', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/lookup", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/lookup",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/peppol/document-typesSupported Peppol document types read

Integration tokens need the read ability.

Identifiant d'opération companies.peppol.document-types

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • document_typesPeppolDocumentType[]
  • familiesstring[]
  • identifier_schemesobject
    Country => ISO 6523 scheme (BE: 0208).
Exemple
{
    "document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "families": [
        "string"
    ],
    "identifier_schemes": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/document-types" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/document-types', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/document-types", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/document-types",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/peppol/logsCalls to the access point read

Last calls made for the file, for support.

Integration tokens need the read ability.

Identifiant d'opération companies.peppol.logs

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
limitinteger1 to 200, 50 by default.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • logsobject[]
Exemple
{
    "logs": [
        {}
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/logs" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/logs', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/logs", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/peppol/logs",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/third-parties/peppol/check-allCheck the Peppol status of every third party write Hors démo 6 / 1 min

Up to 100 third parties per call.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 6 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.third-parties.peppol.check-all

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • only_staleboolean | null
    Only the statuses older than 7 days.
Exemple
{
    "only_stale": true
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • checkedinteger
    ex. 42
  • registeredinteger
    ex. 17
  • errorsinteger
    ex. 0
  • skippedinteger
    Third parties without a usable identifier.
    ex. 1
Exemple
{
    "checked": 42,
    "registered": 17,
    "errors": 0,
    "skipped": 1
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/peppol/check-all" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "only_stale": true
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/peppol/check-all', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'only_stale' => true,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/peppol/check-all", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "only_stale": true
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/peppol/check-all",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "only_stale": True
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{thirdParty}/peppolPeppol status of a third party read 60 / 1 min

Cached 7 days; refresh=1 asks the network again.

Integration tokens need the read ability.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.third-parties.peppol

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
thirdParty requisintegerId of the third party.
ex. 18

Paramètres de requête

NomTypeDescription
refreshboolean

Entêtes communs : Accept-Language

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma PeppolThirdPartyStatus

Exemple
{
    "identifier": "0208:0402531376",
    "registered": true,
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "checked_at": "2026-03-15T09:41:00+00:00",
    "stale": true,
    "error": "string",
    "source": "sml+smp"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/peppol" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/peppol', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/peppol", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/18/peppol",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Integrations

Catalogue of integrations, Novadesko synchronisation, file relays.

GET/v1/companies/{company}/integrationsCatalogue of integrations read

Every integration with its status, its configuration schema and the connection of the file.

Integration tokens need the read ability.

Identifiant d'opération companies.integrations.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
langstring
fr nl en de

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
Exemple
{
    "integrations": [
        {
            "slug": "novadesko",
            "name": "Novadesko",
            "category": "accounting",
            "description": "Description",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "status": "available",
            "capabilities": [
                "import_documents"
            ],
            "config_schema": [
                {
                    "key": "string",
                    "label": "Facture Brasserie Dubuisson",
                    "type": "text",
                    "required": true
                }
            ],
            "open_tab": "string",
            "has_driver": true,
            "is_enabled": true,
            "connection": {
                "is_active": true,
                "status": "connected",
                "config_masked": {},
                "last_sync_at": "2026-03-15T09:41:00+00:00",
                "last_error": "string"
            },
            "interested": true,
            "actions": [
                "string"
            ]
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/integrations/{integration}/activateActivate an integration write Hors démo

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • integration_error: generic driver error
  • not_available: integration not available yet
  • not_connected: the integration is not active on the file
  • integration_inactive: the integration is switched off
  • no_driver: nothing to run for this integration
  • not_linked: the file is not linked to the external system
  • use_open_tab: managed from its own tab (Peppol)
  • file_required: a file is expected
  • file_too_large: file above the size limit
  • sync_failed: the run failed
  • novadesko_locked: locked on the Novadesko side

Identifiant d'opération companies.integrations.activate

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • configobject | null
    Values of the configuration schema.
Exemple
{
    "config": []
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Integration

Exemple
{
    "slug": "novadesko",
    "name": "Novadesko",
    "category": "accounting",
    "description": "Description",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "available",
    "capabilities": [
        "import_documents"
    ],
    "config_schema": [
        {
            "key": "string",
            "label": "Facture Brasserie Dubuisson",
            "type": "text",
            "required": true
        }
    ],
    "open_tab": "string",
    "has_driver": true,
    "is_enabled": true,
    "connection": {
        "is_active": true,
        "status": "connected",
        "config_masked": {},
        "last_sync_at": "2026-03-15T09:41:00+00:00",
        "last_error": "string"
    },
    "interested": true,
    "actions": [
        "string"
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/activate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "config": []
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/activate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'config' => [],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/activate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "config": []
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/activate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "config": []
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/integrations/{integration}/deactivateDeactivate an integration write Hors démo

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • integration_error: generic driver error
  • not_available: integration not available yet
  • not_connected: the integration is not active on the file
  • integration_inactive: the integration is switched off
  • no_driver: nothing to run for this integration
  • not_linked: the file is not linked to the external system
  • use_open_tab: managed from its own tab (Peppol)
  • file_required: a file is expected
  • file_too_large: file above the size limit
  • sync_failed: the run failed
  • novadesko_locked: locked on the Novadesko side

Identifiant d'opération companies.integrations.deactivate

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Integration

Exemple
{
    "slug": "novadesko",
    "name": "Novadesko",
    "category": "accounting",
    "description": "Description",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "available",
    "capabilities": [
        "import_documents"
    ],
    "config_schema": [
        {
            "key": "string",
            "label": "Facture Brasserie Dubuisson",
            "type": "text",
            "required": true
        }
    ],
    "open_tab": "string",
    "has_driver": true,
    "is_enabled": true,
    "connection": {
        "is_active": true,
        "status": "connected",
        "config_masked": {},
        "last_sync_at": "2026-03-15T09:41:00+00:00",
        "last_error": "string"
    },
    "interested": true,
    "actions": [
        "string"
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/deactivate" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/deactivate', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/deactivate", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/deactivate",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/integrations/{integration}/configUpdate the configuration write Hors démo

Secrets are stored encrypted and returned masked.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • integration_error: generic driver error
  • not_available: integration not available yet
  • not_connected: the integration is not active on the file
  • integration_inactive: the integration is switched off
  • no_driver: nothing to run for this integration
  • not_linked: the file is not linked to the external system
  • use_open_tab: managed from its own tab (Peppol)
  • file_required: a file is expected
  • file_too_large: file above the size limit
  • sync_failed: the run failed
  • novadesko_locked: locked on the Novadesko side

Identifiant d'opération companies.integrations.config

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • configobjectrequis
Exemple
{
    "config": {}
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma Integration

Exemple
{
    "slug": "novadesko",
    "name": "Novadesko",
    "category": "accounting",
    "description": "Description",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "available",
    "capabilities": [
        "import_documents"
    ],
    "config_schema": [
        {
            "key": "string",
            "label": "Facture Brasserie Dubuisson",
            "type": "text",
            "required": true
        }
    ],
    "open_tab": "string",
    "has_driver": true,
    "is_enabled": true,
    "connection": {
        "is_active": true,
        "status": "connected",
        "config_masked": {},
        "last_sync_at": "2026-03-15T09:41:00+00:00",
        "last_error": "string"
    },
    "interested": true,
    "actions": [
        "string"
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/config" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "config": {}
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/config', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'config' => [],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/config", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "config": {}
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/config",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "config": {}
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/integrations/{integration}/testTest the connection write Hors démo 12 / 1 min

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 12 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • integration_error: generic driver error
  • not_available: integration not available yet
  • not_connected: the integration is not active on the file
  • integration_inactive: the integration is switched off
  • no_driver: nothing to run for this integration
  • not_linked: the file is not linked to the external system
  • use_open_tab: managed from its own tab (Peppol)
  • file_required: a file is expected
  • file_too_large: file above the size limit
  • sync_failed: the run failed
  • novadesko_locked: locked on the Novadesko side

Identifiant d'opération companies.integrations.test

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "ok": true,
    "message": "OK",
    "integration": {
        "slug": "novadesko",
        "name": "Novadesko",
        "category": "accounting",
        "description": "Description",
        "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "status": "available",
        "capabilities": [
            "import_documents"
        ],
        "config_schema": [
            {
                "key": "string",
                "label": "Facture Brasserie Dubuisson",
                "type": "text",
                "required": true
            }
        ],
        "open_tab": "string",
        "has_driver": true,
        "is_enabled": true,
        "connection": {
            "is_active": true,
            "status": "connected",
            "config_masked": {},
            "last_sync_at": "2026-03-15T09:41:00+00:00",
            "last_error": "string"
        },
        "interested": true,
        "actions": [
            "string"
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/test" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/test', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/test", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/test",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/integrations/{integration}/syncRun a synchronisation write Hors démo 12 / 1 min

Runs the driver synchronously. JSON options (full) or, for file_import, a multipart upload (file: CODA, CSV…). On failure the answer is 422 with the last run.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 12 requests per minute (429 beyond, see Retry-After).

Error codes (code):

  • integration_error: generic driver error
  • not_available: integration not available yet
  • not_connected: the integration is not active on the file
  • integration_inactive: the integration is switched off
  • no_driver: nothing to run for this integration
  • not_linked: the file is not linked to the external system
  • use_open_tab: managed from its own tab (Peppol)
  • file_required: a file is expected
  • file_too_large: file above the size limit
  • sync_failed: the run failed
  • novadesko_locked: locked on the Novadesko side

Identifiant d'opération companies.integrations.sync

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • fullboolean
    Full resynchronisation instead of incremental.
Exemple
{
    "full": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "run": {
        "id": 77,
        "status": "running",
        "started_at": "2026-03-15T09:41:00+00:00",
        "finished_at": "2026-03-15T09:41:00+00:00",
        "duration_ms": 1840,
        "summary": {},
        "message": "OK"
    },
    "result": {},
    "integration": {
        "slug": "novadesko",
        "name": "Novadesko",
        "category": "accounting",
        "description": "Description",
        "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "status": "available",
        "capabilities": [
            "import_documents"
        ],
        "config_schema": [
            {
                "key": "string",
                "label": "Facture Brasserie Dubuisson",
                "type": "text",
                "required": true
            }
        ],
        "open_tab": "string",
        "has_driver": true,
        "is_enabled": true,
        "connection": {
            "is_active": true,
            "status": "connected",
            "config_masked": {},
            "last_sync_at": "2026-03-15T09:41:00+00:00",
            "last_error": "string"
        },
        "interested": true,
        "actions": [
            "string"
        ]
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/sync" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "full": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/sync', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'full' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/sync", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "full": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/sync",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "full": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/integrations/{integration}/runsSynchronisation runs read

Integration tokens need the read ability.

Identifiant d'opération companies.integrations.runs

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Paramètres de requête

NomTypeDescription
limitinteger1 to 100, 20 by default.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
Exemple
{
    "runs": [
        {
            "id": 77,
            "status": "running",
            "started_at": "2026-03-15T09:41:00+00:00",
            "finished_at": "2026-03-15T09:41:00+00:00",
            "duration_ms": 1840,
            "summary": {},
            "message": "OK"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/runs" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/runs', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/runs", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/runs",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/integrations/{integration}/interestRegister an interest write Hors démo

For an integration that is not available yet (coming_soon).

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération companies.integrations.interest

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
integration requisstringSlug of the integration (novadesko, peppol, file_import, …).
ex. novadesko

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • registeredboolean
  • registered_atstring <date-time>
  • slugstring
    ex. codabox
Exemple
{
    "registered": true,
    "registered_at": "2026-03-15T09:41:00+00:00",
    "slug": "codabox"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/interest" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/interest', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/interest", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/integrations/novadesko/interest",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/sync/novadeskoSynchronise the file from Novadesko write Hors démo 10 / 1 min

Reads documents, bank statements (CODA) and fixed assets of the linked shop. Read-only on the Novadesko side. 422 when the file is not linked or the integration is inactive.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 10 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.sync.novadesko

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • fullboolean
    Reload everything instead of the changes since the last run.
Exemple
{
    "full": false
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • documentsinteger
    Documents created or updated.
    ex. 12
  • bank_transactionsinteger
    ex. 34
  • coda_filesinteger
    ex. 2
  • fixed_assetsinteger
    ex. 0
  • errorstring | null
  • synced_atstring <date-time>
Exemple
{
    "documents": 12,
    "bank_transactions": 34,
    "coda_files": 2,
    "fixed_assets": 0,
    "error": "string",
    "synced_at": "2026-03-15T09:41:00+00:00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/novadesko" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "full": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/novadesko', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'full' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/novadesko", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "full": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/novadesko",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "full": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/files/preview-urlSigned URL of a Novadesko file read

Novadesko files cannot be framed directly; this returns a signed relay URL valid 20 minutes. Only whitelisted hosts and paths are relayed.

Integration tokens need the read ability.

Identifiant d'opération companies.files.preview-url

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
url requisstring <uri>File on web.novadesko.com.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • urlstring <uri>
  • expires_ininteger
    ex. 1200
Exemple
{
    "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "expires_in": 1200
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/preview-url?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/preview-url', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'query' => [
        'url' => 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/preview-url?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/preview-url",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    params={
        "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/files/viewSigned relay of a Novadesko file URL signée 120 / 1 min

Target of files/preview-url: serves the PDF or image inline with frame-ancestors allowing the app.

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 120 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération files.view

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
url requisstring <uri>

Entêtes communs : signature expires

Réponses

200The file, inline.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

application/pdf

image/png

image/jpeg

403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/view?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/view', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'query' => [
        'url' => 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/view?url=https%3A%2F%2Fapi.novafisko.com%2Fv1%2Fcompanies%2FXBVD5O1L29HC", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/files/view",
    headers={
        "Accept": "application/json",
    },
    params={
        "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

History & recycle bin

Version history, revert, recycle bin, activity feed.

GET/v1/companies/{company}/historyVersion history read

Who changed what, from which device, newest first.

Integration tokens need the read ability.

Identifiant d'opération companies.history.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
subject_typestringthird_parties, accounts, journals, entries, documents, bank_transactions, fixed_assets…
subject_idinteger
user_idinteger
actionstring
created updated deleted restored reverted synced
originstring
online offline_sync system bridge
operation_idstring <uuid>
device_idstring
fromstring <date>
tostring <date>
qstringRecord label, user or device.
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/history/usersFilters of the history read

People and devices that changed something, subject types and actions.

Integration tokens need the read ability.

Identifiant d'opération companies.history.users

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • dataobject[]
    Propriétés
    • idinteger
    • namestring
      ex. Claire Dumont
    • revisionsinteger
      ex. 214
    • last_atstring <date-time> | null
    • rolestring
      ex. firm_admin
  • devicesobject[]
    Propriétés
    • idstring
    • namestring | null
    • revisionsinteger
  • subject_typesobject[]
    Propriétés
    • keystring
      ex. third_parties
    • labelstring
      ex. Tiers
  • actionsobject[]
    Propriétés
    • keystring
      ex. created
    • labelstring
      ex. Création
Exemple
{
    "data": [
        {
            "id": 42,
            "name": "Claire Dumont",
            "revisions": 214,
            "last_at": "2026-03-15T09:41:00+00:00",
            "role": "firm_admin"
        }
    ],
    "devices": [
        {
            "id": "string",
            "name": "Le Comptoir Montois SRL",
            "revisions": 1
        }
    ],
    "subject_types": [
        {
            "key": "third_parties",
            "label": "Tiers"
        }
    ],
    "actions": [
        {
            "key": "created",
            "label": "Création"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/users" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/users', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/users", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/users",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/history/exportExport the history (CSV) read 30 / 1 min

Same filters as the list. UTF-8 with BOM, semicolon separated.

Integration tokens need the read ability.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.history.export

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
subject_typestringthird_parties, accounts, journals, entries, documents, bank_transactions, fixed_assets…
subject_idinteger
user_idinteger
actionstring
created updated deleted restored reverted synced
originstring
online offline_sync system bridge
operation_idstring <uuid>
device_idstring
fromstring <date>
tostring <date>
qstringRecord label, user or device.

Entêtes communs : Accept-Language

Réponses

200CSV file.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/export" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/export', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/export", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/export",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/history/settingsRetention settings read

Integration tokens need the read ability.

Identifiant d'opération companies.history.settings

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • trash_retention_daysinteger
    ex. 90
  • default_trash_retention_daysinteger
    ex. 90
  • min_trash_retention_daysinteger
    ex. 7
  • max_trash_retention_daysinteger
    ex. 3650
  • sync_retention_daysinteger
    ex. 90
  • can_editboolean
Exemple
{
    "trash_retention_days": 90,
    "default_trash_retention_days": 90,
    "min_trash_retention_days": 7,
    "max_trash_retention_days": 3650,
    "sync_retention_days": 90,
    "can_edit": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/companies/{company}/history/settingsUpdate the retention of the recycle bin write

Managers only.

Integration tokens need the write ability.

Error codes (code):

  • settings_forbidden: only a manager can change this setting

Identifiant d'opération companies.history.settings.update

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Corps de la requête

application/json

Schéma object
  • trash_retention_daysintegerrequis
    7 to 3650.
Exemple
{
    "trash_retention_days": 180
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • trash_retention_daysinteger
    ex. 180
  • default_trash_retention_daysinteger
    ex. 90
  • min_trash_retention_daysinteger
    ex. 7
  • max_trash_retention_daysinteger
    ex. 3650
  • sync_retention_daysinteger
    ex. 90
  • can_editboolean
Exemple
{
    "trash_retention_days": 180,
    "default_trash_retention_days": 90,
    "min_trash_retention_days": 7,
    "max_trash_retention_days": 3650,
    "sync_retention_days": 90,
    "can_edit": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "trash_retention_days": 180
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'trash_retention_days' => 180,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "trash_retention_days": 180
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/settings",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "trash_retention_days": 180
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/history/operations/{operation}/revertUndo a whole operation write

Reverts every change recorded under one X-Operation-Id, newest first, in one transaction: all or nothing.

Integration tokens need the write ability.

Error codes (code):

  • conflict: the record changed since then (forceable by a manager with force: true)
  • period_locked: locked period or closed fiscal year
  • vat_locked: VAT return validated or submitted
  • already_reverted: already reverted
  • not_revertible: this kind of change cannot be reverted
  • entry_immutable: a posted entry is reversed, not modified
  • in_use: the record is in use
  • booked: the record is booked
  • code_taken: the code is used by another record
  • force_forbidden: only a manager can force
  • read_only: read-only access to the file
  • operation_not_found: unknown operation
  • operation_not_revertible: one change of the batch cannot be reverted
  • nothing_to_revert: nothing to revert

Identifiant d'opération companies.history.operations.revert

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
operation requisstring <uuid>Operation id (X-Operation-Id) grouping the changes of one action.
ex. bf413a19-2136-4504-bc42-b314637eb5c7

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • reasonstring | null
  • forceboolean
    Overwrite newer values (managers).
Exemple
{
    "reason": "Erreur de saisie"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • revertedboolean
  • operation_idstring <uuid>
  • countinteger
    ex. 3
  • revisionsRevision[]
  • skippedobject[]
Exemple
{
    "reverted": true,
    "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "count": 3,
    "revisions": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "skipped": [
        {}
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/operations/bf413a19-2136-4504-bc42-b314637eb5c7/revert" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reason": "Erreur de saisie"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/operations/bf413a19-2136-4504-bc42-b314637eb5c7/revert', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reason' => 'Erreur de saisie',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/operations/bf413a19-2136-4504-bc42-b314637eb5c7/revert", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reason": "Erreur de saisie"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/operations/bf413a19-2136-4504-bc42-b314637eb5c7/revert",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reason": "Erreur de saisie"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/history/{revision}Revision read

With the snapshots before and after.

Integration tokens need the read ability.

Identifiant d'opération companies.history.show

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
revision requisintegerId of the revision (history line).
ex. 2301

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma Revision

Exemple
{
    "id": 2301,
    "action": "created",
    "effect": "updated",
    "action_label": "Modification · Tiers",
    "subject_type": "third_parties",
    "subject_type_label": "Tiers",
    "subject_id": 18,
    "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
    "user": {
        "id": 12,
        "name": "Claire Dumont"
    },
    "actor_name": "Claire Dumont",
    "changes": [
        {
            "field": "payment_terms_days",
            "label": "Délai de paiement",
            "old": null,
            "new": null
        }
    ],
    "version": 4,
    "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    "origin": "online",
    "device_id": "mac-7F3A21",
    "device_name": "MacBook de Claire",
    "reason": "string",
    "reverts_revision_id": 42,
    "reverted_at": "2026-03-15T09:41:00+00:00",
    "reverted_by_revision_id": 42,
    "occurred_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "can_revert": true,
    "revert_blocked_reason": "string",
    "revert_blocked_message": "string",
    "revert_effect": "string",
    "snapshot_before": {},
    "snapshot_after": {},
    "ip": "string"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/history/{revision}/revertRevert a change write

Puts back the state before the change: an update restores the previous values, a deletion restores the record, a creation sends it to the recycle bin, a posted entry is reversed. The revert is itself recorded and revertible.

Integration tokens need the write ability.

Error codes (code):

  • conflict: the record changed since then (forceable by a manager with force: true)
  • period_locked: locked period or closed fiscal year
  • vat_locked: VAT return validated or submitted
  • already_reverted: already reverted
  • not_revertible: this kind of change cannot be reverted
  • entry_immutable: a posted entry is reversed, not modified
  • in_use: the record is in use
  • booked: the record is booked
  • code_taken: the code is used by another record
  • force_forbidden: only a manager can force
  • read_only: read-only access to the file
  • operation_not_found: unknown operation
  • operation_not_revertible: one change of the batch cannot be reverted
  • nothing_to_revert: nothing to revert

Identifiant d'opération companies.history.revert

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
revision requisintegerId of the revision (history line).
ex. 2301

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • reasonstring | null
  • forceboolean
Exemple
{
    "reason": "Mauvais tiers"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • revertedboolean
  • effectstring
    updated trashed restored recreated reversed
  • revision_idsinteger[]
  • subject_typestring
  • subject_idinteger
  • reversal_entry_idinteger | null
  • revisionRevision
  • revisionsRevision[]
Exemple
{
    "reverted": true,
    "effect": "updated",
    "revision_ids": [
        1
    ],
    "subject_type": "string",
    "subject_id": 42,
    "reversal_entry_id": 42,
    "revision": {
        "id": 2301,
        "action": "created",
        "effect": "updated",
        "action_label": "Modification · Tiers",
        "subject_type": "third_parties",
        "subject_type_label": "Tiers",
        "subject_id": 18,
        "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
        "user": {
            "id": 12,
            "name": "Claire Dumont"
        },
        "actor_name": "Claire Dumont",
        "changes": [
            {
                "field": "payment_terms_days",
                "label": "Délai de paiement",
                "old": null,
                "new": null
            }
        ],
        "version": 4,
        "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
        "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
        "origin": "online",
        "device_id": "mac-7F3A21",
        "device_name": "MacBook de Claire",
        "reason": "string",
        "reverts_revision_id": 42,
        "reverted_at": "2026-03-15T09:41:00+00:00",
        "reverted_by_revision_id": 42,
        "occurred_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "can_revert": true,
        "revert_blocked_reason": "string",
        "revert_blocked_message": "string",
        "revert_effect": "string",
        "snapshot_before": {},
        "snapshot_after": {},
        "ip": "string"
    },
    "revisions": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301/revert" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "reason": "Mauvais tiers"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301/revert', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'reason' => 'Mauvais tiers',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301/revert", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "reason": "Mauvais tiers"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/history/2301/revert",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "reason": "Mauvais tiers"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/activityActivity of the file read

Audit trail (sign-ins, exports, bookings…) and history merged, newest first. No total: use has_more.

Integration tokens need the read ability.

Identifiant d'opération companies.activity

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
user_idinteger
fromstring <date>
tostring <date>
typestring
sourcestring
audit revision
qstring
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma ActivityFeed

Exemple
{
    "data": [
        {
            "source": "audit",
            "at": "2026-03-15T09:41:00+00:00",
            "recorded_at": "2026-03-15T09:41:00+00:00",
            "user": null,
            "action": "entry.posted",
            "action_label": "Écriture validée",
            "subject_type": "string",
            "subject_id": 42,
            "subject_label": "string",
            "origin": "string",
            "device_name": "MacBook de Claire",
            "revision_id": 42,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "company_id": 7,
            "changed_fields": [
                "string"
            ],
            "company": {
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL"
            }
        }
    ],
    "current_page": 1,
    "per_page": 50,
    "has_more": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/activity" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/activity', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/activity", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/activity",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/trashRecycle bin read

Integration tokens need the read ability.

Identifiant d'opération companies.trash.index

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
typestringRecycle bin type.
qstring
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • dataTrashItem[]
  • countsobject
    Type => count.
  • typesobject[]
    Propriétés
    • keystring
    • labelstring
    • countinteger
  • totalinteger
  • current_pageinteger
  • per_pageinteger
  • last_pageinteger
  • retention_daysinteger
    ex. 90
  • can_purgeboolean
Exemple
{
    "data": [
        {
            "type": "third_parties",
            "id": 18,
            "label": "DUBUISSON · Brasserie Dubuisson SA",
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": null,
            "purge_at": "2026-03-15T09:41:00+00:00",
            "restorable": true,
            "blocked_reason": "string",
            "blocked_message": "string",
            "version": 3
        }
    ],
    "counts": {},
    "types": [
        {
            "key": "string",
            "label": "Facture Brasserie Dubuisson",
            "count": 12
        }
    ],
    "total": 1,
    "current_page": 1,
    "per_page": 50,
    "last_page": 1,
    "retention_days": 90,
    "can_purge": true
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/trash/restore-allRestore everything write

Optionally one type only.

Integration tokens need the write ability.

Identifiant d'opération companies.trash.restore-all

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête facultatif

application/json

Schéma object
  • typestring | null
Exemple
{
    "type": "third_parties"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • restoredinteger
    ex. 4
  • skippedobject[]
    Propriétés
    • typestring
    • idinteger
    • labelstring
    • blocked_reasonstring
      ex. code_taken
Exemple
{
    "restored": 4,
    "skipped": [
        {
            "type": "string",
            "id": 42,
            "label": "Facture Brasserie Dubuisson",
            "blocked_reason": "code_taken"
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/restore-all" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "type": "third_parties"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/restore-all', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'type' => 'third_parties',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/restore-all", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "type": "third_parties"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/restore-all",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "type": "third_parties"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/trash/{type}/{id}/restoreRestore a record write

A third party whose code was taken comes back with a suffixed code; an account, journal or analytic code is refused (code_taken).

Integration tokens need the write ability.

Error codes (code):

  • code_taken: the code is used by another record
  • parent_missing: the linked record no longer exists
  • not_in_trash: the record is not in the recycle bin
  • restore_failed: the restore failed

Identifiant d'opération companies.trash.restore

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringRecycle bin type: third_parties, accounts, journals, journal_rules, bank_rules, recurring_entries, analytic_codes, fixed_assets, documents, document_imports, integrations.
ex. third_parties
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
  • restoredboolean
  • typestring
  • idinteger
  • labelstring
  • versioninteger
  • dataobject
Exemple
{
    "restored": true,
    "type": "string",
    "id": 42,
    "label": "Facture Brasserie Dubuisson",
    "version": 3,
    "data": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42/restore" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42/restore', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42/restore", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42/restore",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/trash/{type}/{id}Delete definitively write

Managers only; recorded in the audit trail. Cannot be undone.

Integration tokens need the write ability.

Error codes (code):

  • purge_forbidden: only a manager can purge

Identifiant d'opération companies.trash.purge

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
type requisstringRecycle bin type: third_parties, accounts, journals, journal_rules, bank_rules, recurring_entries, analytic_codes, fixed_assets, documents, document_imports, integrations.
ex. third_parties
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/trash/third_parties/42",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/third-parties/{id}/historyHistory of one record (third parties) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.third-parties

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/third-parties/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/entries/{id}/historyHistory of one record (entries) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.entries

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/entries/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/documents/{id}/historyHistory of one record (documents) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.documents

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/accounts/{id}/historyHistory of one record (accounts) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.accounts

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/bank-transactions/{id}/historyHistory of one record (bank transactions) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.bank-transactions

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/bank-transactions/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/fixed-assets/{id}/historyHistory of one record (fixed assets) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.fixed-assets

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/journals/{id}/historyHistory of one record (journals) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.journals

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/journals/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/recurring-entries/{id}/historyHistory of one record (recurring entries) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.recurring-entries

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/recurring-entries/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/vat-declarations/{id}/historyHistory of one record (vat declarations) read

Same items as the version history, limited to one record.

Integration tokens need the read ability.

Identifiant d'opération companies.history.subject.vat-declarations

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Paramètres de requête

NomTypeDescription
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 2301,
            "action": "created",
            "effect": "updated",
            "action_label": "Modification · Tiers",
            "subject_type": "third_parties",
            "subject_type_label": "Tiers",
            "subject_id": 18,
            "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
            "user": null,
            "actor_name": "Claire Dumont",
            "changes": [
                {
                    "field": "payment_terms_days",
                    "label": "Délai de paiement",
                    "old": null,
                    "new": null
                }
            ],
            "version": 4,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "origin": "online",
            "device_id": "mac-7F3A21",
            "device_name": "MacBook de Claire",
            "reason": "string",
            "reverts_revision_id": 42,
            "reverted_at": "2026-03-15T09:41:00+00:00",
            "reverted_by_revision_id": 42,
            "occurred_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "can_revert": true,
            "revert_blocked_reason": "string",
            "revert_blocked_message": "string",
            "revert_effect": "string",
            "snapshot_before": {},
            "snapshot_after": {},
            "ip": "string"
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/42/history" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/42/history', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/42/history", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/vat-declarations/42/history",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/accounts/{id}Move to the recycle bin (accounts) write

Refused with 422 when the record is used or booked.

Integration tokens need the write ability.

Error codes (code):

  • in_use: the record is used by entries or documents
  • booked: the record is booked: reverse the entry first

Identifiant d'opération companies.trash.destroy.accounts

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/accounts/42",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/analytic-codes/{id}Move to the recycle bin (analytic codes) write

Refused with 422 when the record is used or booked.

Integration tokens need the write ability.

Error codes (code):

  • in_use: the record is used by entries or documents
  • booked: the record is booked: reverse the entry first

Identifiant d'opération companies.trash.destroy.analytic-codes

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/42" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/42', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/42", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/analytic-codes/42",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/fixed-assets/{id}Move to the recycle bin (fixed assets) write

Refused with 422 when the record is used or booked.

Integration tokens need the write ability.

Error codes (code):

  • in_use: the record is used by entries or documents
  • booked: the record is booked: reverse the entry first

Identifiant d'opération companies.trash.destroy.fixed-assets

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/fixed-assets/42",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/companies/{company}/documents/{id}Move to the recycle bin (documents) write

Refused with 422 when the record is used or booked.

Integration tokens need the write ability.

Error codes (code):

  • in_use: the record is used by entries or documents
  • booked: the record is booked: reverse the entry first

Identifiant d'opération companies.trash.destroy.documents

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
id requisintegerId of the record.
ex. 42

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin X-Base-Version

Réponses

204Done, no body.
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
409Optimistic lock: the record changed on the server since the version sent in X-Base-Version. Nothing was modified. VersionConflict
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/documents/42",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Synchronisation

Continuous and offline synchronisation: bootstrap, pull, push, conflicts. Requires the sync ability for integration tokens.

GET/v1/companies/{company}/sync/bootstrapFirst load sync

Starting point of a local copy: the cursor, the list of resources with their REST endpoint, the company, its settings and the rights of the user. Load each resource through its endpoint, then keep cursor for sync/pull.

Integration tokens need the sync ability.

Identifiant d'opération companies.sync.bootstrap

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • cursorinteger
    ex. 1042
  • server_timestring <date-time>
  • full_resyncboolean
    ex. false
  • retention_daysinteger
    ex. 90
  • resourcesobject[]
    Propriétés
    • namestring
      ex. third_parties
    • countinteger
      ex. 187
    • endpointstring
      ex. companies/XBVD5O1L29HC/third-parties
    • paginatedboolean
      ex. false
  • companyCompany
  • company_settingsCompanySettings
  • userobject
    Propriétés
    • idinteger
    • namestring
      ex. Claire Dumont
    • rolestring
      ex. firm_admin
    • role_rankinteger
    • can_writeboolean
    • can_forceboolean
  • pushobject
    Propriétés
    • resourcesstring[]
    • max_mutationsinteger
      ex. 200
    • temp_id_prefixstring
      ex. tmp-
Exemple
{
    "cursor": 1042,
    "server_time": "2026-03-15T09:41:00+00:00",
    "full_resync": false,
    "retention_days": 90,
    "resources": [
        {
            "name": "third_parties",
            "count": 187,
            "endpoint": "companies/XBVD5O1L29HC/third-parties",
            "paginated": false
        }
    ],
    "company": {
        "id": 7,
        "public_token": "XBVD5O1L29HC",
        "firm_id": 3,
        "code": "COMPTOIR",
        "name": "Le Comptoir Montois SRL",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "country_pack": "BE",
        "vat_regime": "monthly",
        "currency": "EUR",
        "locale": "fr",
        "address": "Grand-Place 14, 7000 Mons",
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE",
        "latitude": "50.4541000",
        "longitude": "3.9523000",
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN"
            }
        ],
        "main_nace_code": "56111",
        "company_sheet_at": "2026-03-15T09:41:00+00:00",
        "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "fiscal_year_start": "2026-03-15",
        "fiscal_year_end": "2026-03-15",
        "settings": {
            "vat": {
                "administration_cell": "string",
                "structured_communication": "000000000101",
                "directorate_number": "string",
                "office_number": "string",
                "declarant": {
                    "applicable": false,
                    "company_name": "string",
                    "signatory_1": "string",
                    "signatory_1_title": "string",
                    "signatory_2": "string",
                    "signatory_2_title": "string",
                    "phone": "+32 65 31 42 18",
                    "fax": "string",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "language": "fr"
                },
                "sender_281_50": {
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "address": "Grand-Place 14",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                },
                "filer": {
                    "quality": "company",
                    "name": "Le Comptoir Montois SRL",
                    "enterprise_number": "0477472701",
                    "phone": "+32 65 31 42 18",
                    "email": "claire.dumont@fiduciaire-dumont.be"
                }
            },
            "legal": {
                "rpm_district": "Hainaut, division Mons"
            },
            "annual_accounts": {
                "scheme": "abbreviated",
                "general_meeting_date": "2026-03-15",
                "directors": "string",
                "valuation_rules": "string"
            },
            "auto_entries": {
                "vat": {
                    "payable_account": "451000",
                    "receivable_account": "411000",
                    "correction_payable_account": "string",
                    "correction_receivable_account": "string",
                    "journal_id": 3
                },
                "invoices_to_receive": {
                    "supplier_account": "444000",
                    "customer_account": "404000",
                    "journal_id": 3
                },
                "reconciliation_difference": {
                    "expense_account": "657000",
                    "income_account": "757000",
                    "max_amount": 1
                },
                "transfers": {
                    "transit_account": "580000",
                    "journal_id": 3
                }
            },
            "history": {
                "trash_retention_days": 90
            }
        },
        "is_active": true,
        "is_demo": false,
        "source": "manual",
        "external_id": "string",
        "synced_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "deleted_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal_entries_count": 1284,
        "firm": {
            "id": 3,
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        },
        "fiscal_years": [
            {
                "id": 2,
                "company_id": 7,
                "code": "2026",
                "starts_on": "2026-01-01T00:00:00.000000Z",
                "ends_on": "2026-12-31T00:00:00.000000Z",
                "is_closed": false,
                "closed_at": "2026-03-15T09:41:00+00:00",
                "closed_by": 1,
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "periods": [
                    {}
                ]
            }
        ],
        "journals": [
            {
                "id": 3,
                "company_id": 7,
                "code": "VEN",
                "label": "Ventes",
                "type": "purchase",
                "control_account_id": 42,
                "iban": "BE68539007547034",
                "bic": "GEBABEBB",
                "last_number": 412,
                "is_active": true,
                "is_default": true,
                "description": "Description",
                "created_at": "2026-03-15T09:41:00+00:00",
                "updated_at": "2026-03-15T09:41:00+00:00",
                "lock_version": 3,
                "version": 3,
                "deleted_at": "2026-03-15T09:41:00+00:00",
                "deleted_by": 1,
                "entries_count": 412,
                "control_account": null,
                "rules": [
                    {}
                ]
            }
        ]
    },
    "company_settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "user": {
        "id": 42,
        "name": "Claire Dumont",
        "role": "firm_admin",
        "role_rank": 1,
        "can_write": true,
        "can_force": true
    },
    "push": {
        "resources": [
            "string"
        ],
        "max_mutations": 200,
        "temp_id_prefix": "tmp-"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/bootstrap" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/bootstrap', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/bootstrap", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/bootstrap",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/sync/pullIncremental pull sync

Changes since a cursor, one line per record (last state). delete is a tombstone (deleted or in the recycle bin). When since is absent, unknown or older than the 90-day journal, full_resync is true and no change is returned: reload everything, then restart from the returned cursor. A change becomes visible two seconds after it was written.

Integration tokens need the sync ability.

Identifiant d'opération companies.sync.pull

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
sinceintegerCursor of the previous pull or bootstrap.
ex. 1042
resourcesstringComma-separated resource names.
ex. third_parties,entries
limitinteger500 by default, 1000 max.

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • cursorinteger
    ex. 1057
  • has_moreboolean
    ex. false
  • full_resyncboolean
    ex. false
  • changesSyncChange[]
  • server_timestring <date-time>
Exemple
{
    "cursor": 1057,
    "has_more": false,
    "full_resync": false,
    "changes": [
        {
            "resource": "third_parties",
            "op": "upsert",
            "id": 18,
            "version": 4,
            "data": {},
            "changed_at": "2026-03-15T09:41:00+00:00",
            "seq": 1042
        }
    ],
    "server_time": "2026-03-15T09:41:00+00:00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/pull" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/pull', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/pull", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/pull",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/sync/pushPush offline mutations sync

Up to 200 mutations, processed in order, each in its own transaction and replayed through the matching REST action. Idempotent on client_mutation_id. Conflicts are settled by the priority rules (posted or locked accounting data always wins; field-by-field merge; highest role, then most recent change).

Integration tokens need the sync ability.

Identifiant d'opération companies.sync.push

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • deviceobject
    Propriétés
    • idstring
    • namestring
    • platformstring
      ex. macos
  • mutationsSyncMutation[]requis
Exemple
{
    "device": {
        "id": "erp-connector-01",
        "name": "ERP connector",
        "platform": "server"
    },
    "mutations": [
        {
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "occurred_at": "2026-10-05T08:00:00Z",
            "resource": "third_parties",
            "op": "create",
            "client_temp_id": "tmp-3c1f",
            "data": {
                "type": "supplier",
                "name": "Proximus SA",
                "vat_number": "BE0202239951"
            }
        }
    ]
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
Exemple
{
    "results": [
        {
            "client_mutation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "status": "applied",
            "original_status": "string",
            "code": "COMPTOIR",
            "message": "OK",
            "resource": "string",
            "op": "string",
            "action": "string",
            "id": 42,
            "client_temp_id": "string",
            "version": 3,
            "data": {},
            "errors": {},
            "conflict": {
                "server_version": 1,
                "server_data": {},
                "fields": [
                    {
                        "field": "string",
                        "client": null,
                        "server": null,
                        "winner": "client",
                        "rule": "string"
                    }
                ],
                "resolution": "string"
            },
            "duplicate_of": 1,
            "retryable": true
        }
    ],
    "cursor": 1,
    "server_time": "2026-03-15T09:41:00+00:00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/push" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "device": {
        "id": "erp-connector-01",
        "name": "ERP connector",
        "platform": "server"
    },
    "mutations": [
        {
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "occurred_at": "2026-10-05T08:00:00Z",
            "resource": "third_parties",
            "op": "create",
            "client_temp_id": "tmp-3c1f",
            "data": {
                "type": "supplier",
                "name": "Proximus SA",
                "vat_number": "BE0202239951"
            }
        }
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/push', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'device' => [
            'id' => 'erp-connector-01',
            'name' => 'ERP connector',
            'platform' => 'server',
        ],
        'mutations' => [
            [
                'client_mutation_id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
                'occurred_at' => '2026-10-05T08:00:00Z',
                'resource' => 'third_parties',
                'op' => 'create',
                'client_temp_id' => 'tmp-3c1f',
                'data' => [
                    'type' => 'supplier',
                    'name' => 'Proximus SA',
                    'vat_number' => 'BE0202239951',
                ],
            ],
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/push", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "device": {
          "id": "erp-connector-01",
          "name": "ERP connector",
          "platform": "server"
      },
      "mutations": [
          {
              "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
              "occurred_at": "2026-10-05T08:00:00Z",
              "resource": "third_parties",
              "op": "create",
              "client_temp_id": "tmp-3c1f",
              "data": {
                  "type": "supplier",
                  "name": "Proximus SA",
                  "vat_number": "BE0202239951"
              }
          }
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/push",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "device": {
            "id": "erp-connector-01",
            "name": "ERP connector",
            "platform": "server"
        },
        "mutations": [
            {
                "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
                "occurred_at": "2026-10-05T08:00:00Z",
                "resource": "third_parties",
                "op": "create",
                "client_temp_id": "tmp-3c1f",
                "data": {
                    "type": "supplier",
                    "name": "Proximus SA",
                    "vat_number": "BE0202239951"
                }
            }
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/sync/statusSynchronisation status sync

Integration tokens need the sync ability.

Identifiant d'opération companies.sync.status

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • cursorinteger
  • server_timestring <date-time>
  • pending_conflictsinteger
    ex. 0
  • last_push_atstring <date-time> | null
  • devicesobject[]
    Propriétés
    • idstring
    • namestring | null
    • platformstring | null
    • userobject | null
    • last_seen_atstring <date-time> | null
    • last_push_atstring <date-time> | null
    • last_cursorinteger | null
Exemple
{
    "cursor": 1,
    "server_time": "2026-03-15T09:41:00+00:00",
    "pending_conflicts": 0,
    "last_push_at": "2026-03-15T09:41:00+00:00",
    "devices": [
        {
            "id": "string",
            "name": "Le Comptoir Montois SRL",
            "platform": "string",
            "user": {},
            "last_seen_at": "2026-03-15T09:41:00+00:00",
            "last_push_at": "2026-03-15T09:41:00+00:00",
            "last_cursor": 1
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/status" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/status', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/status", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/status",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/sync/conflictsSynchronisation conflicts sync

Integration tokens need the sync ability.

Identifiant d'opération companies.sync.conflicts

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
statusstring
open resolved
resourcestring
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 50, maximum 200).
ex. 50

Entêtes communs : Accept-Language

Réponses

200Paginated list

application/json

Schéma Pagination & object

Inclut Pagination

Exemple
{
    "current_page": 1,
    "data": [
        {
            "id": 8,
            "status": "open",
            "type": "field",
            "type_label": "string",
            "resource": "third_parties",
            "record_id": 42,
            "subject_id": 42,
            "subject_label": "string",
            "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
            "fields": [
                {
                    "field": "string",
                    "label": "Facture Brasserie Dubuisson",
                    "server": null,
                    "client": null,
                    "winner": "string",
                    "rule": "string"
                }
            ],
            "client_data": {},
            "server_data": {},
            "server_version": 1,
            "winner": "string",
            "loser": "string",
            "resolution": "string",
            "resolved_by": 1,
            "client_user": {},
            "server_user": {},
            "resolved_by_user": {},
            "device_id": "mac-7F3A21",
            "created_at": "2026-03-15T09:41:00+00:00",
            "resolved_at": "2026-03-15T09:41:00+00:00",
            "choices": [
                "server"
            ]
        }
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187,
    "open": 0
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/sync/conflicts/{conflict}/resolveResolve a conflict sync

client applies the values that were refused, merge applies data, server acknowledges.

Integration tokens need the sync ability.

Error codes (code):

  • conflict_already_resolved: already resolved
  • conflict_choice_unavailable: choice not available for this conflict

Identifiant d'opération companies.sync.conflicts.resolve

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC
conflict requisintegerId of the synchronisation conflict.
ex. 8

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • choicestringrequis
    server client merge
  • dataobject | null
    Required for merge.
Exemple
{
    "choice": "client"
}

Réponses

200OK

Entêtes de réponse X-Operation-Id X-Idempotent-Replay

application/json

Schéma object
Exemple
{
    "resolved": true,
    "conflict": {
        "id": 8,
        "status": "open",
        "type": "field",
        "type_label": "string",
        "resource": "third_parties",
        "record_id": 42,
        "subject_id": 42,
        "subject_label": "string",
        "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
        "fields": [
            {
                "field": "string",
                "label": "Facture Brasserie Dubuisson",
                "server": null,
                "client": null,
                "winner": "string",
                "rule": "string"
            }
        ],
        "client_data": {},
        "server_data": {},
        "server_version": 1,
        "winner": "string",
        "loser": "string",
        "resolution": "string",
        "resolved_by": 1,
        "client_user": {},
        "server_user": {},
        "resolved_by_user": {},
        "device_id": "mac-7F3A21",
        "created_at": "2026-03-15T09:41:00+00:00",
        "resolved_at": "2026-03-15T09:41:00+00:00",
        "choices": [
            "server"
        ]
    },
    "data": {}
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts/8/resolve" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "choice": "client"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts/8/resolve', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'choice' => 'client',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts/8/resolve", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "choice": "client"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/sync/conflicts/8/resolve",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "choice": "client"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Mail

Mails sent to clients in the name of the firm, shared files.

POST/v1/companies/{company}/mail/documentsSend documents or an export by e-mail write Hors démo 20 / 1 min

Sends documents of the file and / or an export to a client, in the name of the firm. Above 10 MB (or with as_link) the files are sent as a signed download link valid 7 days. Manager role at least.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 20 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.mail.documents

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • tostring <email>[]requis
  • ccstring <email>[]
  • subjectstring | null
  • messagestringrequis
    5000 characters max.
  • document_idsinteger[]
  • exportobject
    Propriétés
    • typestringrequis
      Export code or full-dossier.
    • formatstring
      pdf xlsx csv zip
    • fiscal_year_idinteger | null
    • fromstring <date> | null
    • tostring <date> | null
    • langstring
      fr nl en de
    • paramsobject | null
  • as_linkboolean
Exemple
{
    "to": [
        "gerant@comptoir-montois.example"
    ],
    "subject": "Balance au 30 septembre",
    "message": "Bonjour, vous trouverez ci-joint la balance arrêtée au 30 septembre.",
    "export": {
        "type": "trial-balance",
        "format": "pdf",
        "to": "2026-09-30"
    }
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • messagestring
  • sentinteger
    ex. 1
  • modestring
    attachment link
  • recipientsstring <email>[]
  • attachmentsobject[]
    Propriétés
    • namestring
      ex. balance-2026-09-30.pdf
    • sizeinteger
      ex. 48211
  • link_expires_atstring <date-time> | null
Exemple
{
    "message": "OK",
    "sent": 1,
    "mode": "attachment",
    "recipients": [
        "claire.dumont@fiduciaire-dumont.be"
    ],
    "attachments": [
        {
            "name": "balance-2026-09-30.pdf",
            "size": 48211
        }
    ],
    "link_expires_at": "2026-03-15T09:41:00+00:00"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/documents" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "to": [
        "gerant@comptoir-montois.example"
    ],
    "subject": "Balance au 30 septembre",
    "message": "Bonjour, vous trouverez ci-joint la balance arrêtée au 30 septembre.",
    "export": {
        "type": "trial-balance",
        "format": "pdf",
        "to": "2026-09-30"
    }
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/documents', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'to' => [
            'gerant@comptoir-montois.example',
        ],
        'subject' => 'Balance au 30 septembre',
        'message' => 'Bonjour, vous trouverez ci-joint la balance arrêtée au 30 septembre.',
        'export' => [
            'type' => 'trial-balance',
            'format' => 'pdf',
            'to' => '2026-09-30',
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/documents", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "to": [
          "gerant@comptoir-montois.example"
      ],
      "subject": "Balance au 30 septembre",
      "message": "Bonjour, vous trouverez ci-joint la balance arrêtée au 30 septembre.",
      "export": {
          "type": "trial-balance",
          "format": "pdf",
          "to": "2026-09-30"
      }
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/documents",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "to": [
            "gerant@comptoir-montois.example"
        ],
        "subject": "Balance au 30 septembre",
        "message": "Bonjour, vous trouverez ci-joint la balance arrêtée au 30 septembre.",
        "export": {
            "type": "trial-balance",
            "format": "pdf",
            "to": "2026-09-30"
        }
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/companies/{company}/mail/document-requestAsk a client for missing documents write Hors démo 20 / 1 min

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 20 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération companies.mail.document-request

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Entêtes communs : Accept-Language X-Client-Mutation-Id X-Operation-Id X-Device-Id X-Device-Name X-Occurred-At X-Origin

Corps de la requête

application/json

Schéma object
  • tostring <email>[]requis
  • itemsstring[]requis
  • messagestring | null
  • due_datestring <date> | null
Exemple
{
    "to": [
        "gerant@comptoir-montois.example"
    ],
    "items": [
        "Extrait bancaire de septembre",
        "Facture Engie d'août"
    ],
    "due_date": "2026-10-15"
}

Réponses

201Created

Entêtes de réponse X-Operation-Id X-Idempotent-Replay X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • sentinteger
    ex. 1
  • messagestring
Exemple
{
    "sent": 1,
    "message": "OK"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/document-request" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "X-Client-Mutation-Id: b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11" \
  -d '{
    "to": [
        "gerant@comptoir-montois.example"
    ],
    "items": [
        "Extrait bancaire de septembre",
        "Facture Engie d'\''août"
    ],
    "due_date": "2026-10-15"
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/document-request', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
        'X-Client-Mutation-Id' => 'b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11',
    ],
    'json' => [
        'to' => [
            'gerant@comptoir-montois.example',
        ],
        'items' => [
            'Extrait bancaire de septembre',
            'Facture Engie d\'août',
        ],
        'due_date' => '2026-10-15',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/document-request", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
    "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
  },
  body: JSON.stringify({
      "to": [
          "gerant@comptoir-montois.example"
      ],
      "items": [
          "Extrait bancaire de septembre",
          "Facture Engie d'août"
      ],
      "due_date": "2026-10-15"
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/document-request",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
        "X-Client-Mutation-Id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    },
    json={
        "to": [
            "gerant@comptoir-montois.example"
        ],
        "items": [
            "Extrait bancaire de septembre",
            "Facture Engie d'août"
        ],
        "due_date": "2026-10-15"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/companies/{company}/mail/logsMails sent for the file read

Integration tokens need the read ability.

Identifiant d'opération companies.mail.logs

Paramètres de chemin

NomTypeDescription
company requisstringPublic token of the company file (public_token, 12 characters).
ex. XBVD5O1L29HC

Paramètres de requête

NomTypeDescription
templatestringTemplate key.
per_pageinteger25 by default, 100 max.
pageinteger

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • dataMailLog[]
  • metaobject
    Propriétés
    • current_pageinteger
      ex. 1
    • last_pageinteger
      ex. 1
    • totalinteger
      ex. 12
Exemple
{
    "data": [
        {
            "id": 9012,
            "template_key": "documents.send",
            "to": "gerant@comptoir-montois.example",
            "subject": "Vos documents comptables",
            "status": "queued",
            "locale": "fr",
            "created_at": "2026-03-15T09:41:00+00:00",
            "sent_at": "2026-03-15T09:41:00+00:00",
            "opened_at": "2026-03-15T09:41:00+00:00",
            "attachments": [
                {
                    "name": "balance-2026.pdf",
                    "size": 48211
                }
            ]
        }
    ],
    "meta": {
        "current_page": 1,
        "last_page": 1,
        "total": 12
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/logs" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/logs', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/logs", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/companies/XBVD5O1L29HC/mail/logs",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/mail/shares/{share}Download a shared file URL signée 60 / 1 min

Signed link of a mail (7 days). An expired or purged share redirects to the « download expired » page of the app.

Authorised by the signature of the URL (query parameters signature and expires), not by a bearer token. The URL is issued by another endpoint and expires.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération mail.shares.download

Paramètres de chemin

NomTypeDescription
share requisstringToken of the shared file.
ex. q8ZrT2mVx4

Entêtes communs : signature expires

Réponses

200The file.

Entêtes de réponse Content-Disposition X-RateLimit-Limit X-RateLimit-Remaining

application/octet-stream

302Expired share.
Entête de réponseDescription
LocationTarget of the redirection.
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/mail/shares/q8ZrT2mVx4" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/mail/shares/q8ZrT2mVx4', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/mail/shares/q8ZrT2mVx4", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/mail/shares/q8ZrT2mVx4",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/mail/o/{token}.gifOpen pixel Public 240 / 1 min

Present in the mails only when tracking is switched on by the firm. Not meant to be called by integrations.

Public endpoint: no bearer token.

Rate limit: 240 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération mail.open

Paramètres de chemin

NomTypeDescription
token requisstringOpaque token.
ex. a1B2c3D4e5

Réponses

200Transparent 1 × 1 GIF.

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

image/gif

404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/mail/o/a1B2c3D4e5.gif" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/mail/o/a1B2c3D4e5.gif', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/mail/o/a1B2c3D4e5.gif", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/mail/o/a1B2c3D4e5.gif",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/mail/c/{token}Click redirection Public 240 / 1 min

Followed only when the signature of the target matches (no open redirect). Not meant to be called by integrations.

Public endpoint: no bearer token.

Rate limit: 240 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération mail.click

Paramètres de chemin

NomTypeDescription
token requisstringOpaque token.
ex. a1B2c3D4e5

Paramètres de requête

NomTypeDescription
u requisstringEncoded target.
s requisstringSignature.

Réponses

302Redirection to the target.
Entête de réponseDescription
LocationTarget of the redirection.
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/mail/c/a1B2c3D4e5?u=string&s=string" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/mail/c/a1B2c3D4e5', [
    'headers' => [
        'Accept' => 'application/json',
    ],
    'query' => [
        'u' => 'string',
        's' => 'string',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/mail/c/a1B2c3D4e5?u=string&s=string", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/mail/c/a1B2c3D4e5",
    headers={
        "Accept": "application/json",
    },
    params={
        "u": "string",
        "s": "string"
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Webhooks

Outgoing webhooks of a firm: endpoints, test event, delivery log.

GET/v1/webhooks/eventsCatalogue of webhook events read

Integration tokens need the read ability.

Identifiant d'opération webhooks.events

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • dataobject[]
    Propriétés
    • eventstring
      ex. entry.posted
    • descriptionstring
      ex. An entry was posted.
Exemple
{
    "data": [
        {
            "event": "entry.posted",
            "description": "An entry was posted."
        }
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/webhooks/events" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/webhooks/events', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/webhooks/events", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/webhooks/events",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/firms/{firm}/webhooksList the webhook endpoints read

Admins and managers of the firm (403 for other members, 404 for non-members).

Integration tokens need the read ability.

Identifiant d'opération firms.webhooks.index

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
Exemple
{
    "data": [
        {
            "id": 3,
            "url": "https://erp.example.com/hooks/novafisko",
            "description": "ERP connector",
            "events": [
                "entry.posted"
            ],
            "is_active": true,
            "secret_hint": "whsec_…ab12",
            "last_delivery_at": "2026-03-15T09:41:00+00:00",
            "last_status": "delivered",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00"
        }
    ],
    "available_events": [
        "entry.posted"
    ]
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/firms/{firm}/webhooksCreate a webhook endpoint write Hors démo

The signing secret (whsec_…) is returned once. Events are queued and sent by a dispatcher that runs every minute.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • webhook_limit_reached: 20 endpoints per firm at most
  • webhook_url_refused: the URL is not HTTPS or targets a private / loopback address (production)

Identifiant d'opération firms.webhooks.store

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • urlstring <uri>requis
    HTTPS endpoint that receives the events (500 characters max).
  • descriptionstring | null
  • eventsstring[]requis
  • is_activeboolean
Exemple
{
    "url": "https://erp.example.com/hooks/novafisko",
    "description": "ERP connector",
    "events": [
        "entry.posted",
        "document.booked",
        "vat.declaration_validated"
    ]
}

Réponses

201Created

application/json

Schéma object
  • secretstring
    Signing secret (whsec_ followed by 40 characters), shown once.
    ex. whsec_4Qm9x2kL8vT4nR7sW1pZ5cY3hJ6dF0gA9bE2uI4o
Exemple
{
    "webhook": {
        "id": 3,
        "url": "https://erp.example.com/hooks/novafisko",
        "description": "ERP connector",
        "events": [
            "entry.posted"
        ],
        "is_active": true,
        "secret_hint": "whsec_…ab12",
        "last_delivery_at": "2026-03-15T09:41:00+00:00",
        "last_status": "delivered",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00"
    },
    "data": {
        "id": 3,
        "url": "https://erp.example.com/hooks/novafisko",
        "description": "ERP connector",
        "events": [
            "entry.posted"
        ],
        "is_active": true,
        "secret_hint": "whsec_…ab12",
        "last_delivery_at": "2026-03-15T09:41:00+00:00",
        "last_status": "delivered",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00"
    },
    "secret": "whsec_4Qm9x2kL8vT4nR7sW1pZ5cY3hJ6dF0gA9bE2uI4o"
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://erp.example.com/hooks/novafisko",
    "description": "ERP connector",
    "events": [
        "entry.posted",
        "document.booked",
        "vat.declaration_validated"
    ]
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'url' => 'https://erp.example.com/hooks/novafisko',
        'description' => 'ERP connector',
        'events' => [
            'entry.posted',
            'document.booked',
            'vat.declaration_validated',
        ],
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "url": "https://erp.example.com/hooks/novafisko",
      "description": "ERP connector",
      "events": [
          "entry.posted",
          "document.booked",
          "vat.declaration_validated"
      ]
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "url": "https://erp.example.com/hooks/novafisko",
        "description": "ERP connector",
        "events": [
            "entry.posted",
            "document.booked",
            "vat.declaration_validated"
        ]
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
PATCH/v1/firms/{firm}/webhooks/{webhook}Update a webhook endpoint write Hors démo

A paused endpoint keeps its pending deliveries; they are sent once it is active again.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Error codes (code):

  • webhook_url_refused: the URL is not HTTPS or targets a private / loopback address (production)

Identifiant d'opération firms.webhooks.update

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
webhook requisintegerId of the webhook endpoint.
ex. 3

Entêtes communs : Accept-Language

Corps de la requête

application/json

Schéma object
  • urlstring <uri>
  • descriptionstring | null
  • eventsstring[]
  • is_activeboolean
Exemple
{
    "is_active": false
}

Réponses

200OK

application/json

Schéma object
Exemple
{
    "webhook": {
        "id": 3,
        "url": "https://erp.example.com/hooks/novafisko",
        "description": "ERP connector",
        "events": [
            "entry.posted"
        ],
        "is_active": true,
        "secret_hint": "whsec_…ab12",
        "last_delivery_at": "2026-03-15T09:41:00+00:00",
        "last_status": "delivered",
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00"
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
422Validation failed or business rule refused the request. errors maps each field to its messages; code is present when the refusal has a machine reason. Error

Exemple d'appel

curl -X PATCH "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "is_active": false
}'
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('PATCH', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
    'json' => [
        'is_active' => false,
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3", {
  method: "PATCH",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
      "is_active": false
  }),
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.patch(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    json={
        "is_active": False
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
DELETE/v1/firms/{firm}/webhooks/{webhook}Delete a webhook endpoint write Hors démo

Pending deliveries of the endpoint are dropped.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Identifiant d'opération firms.webhooks.destroy

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
webhook requisintegerId of the webhook endpoint.
ex. 3

Entêtes communs : Accept-Language

Réponses

204Done, no body.

Pas de corps.

401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X DELETE "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('DELETE', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3", {
  method: "DELETE",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.delete(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
POST/v1/firms/{firm}/webhooks/{webhook}/testSend a test event write Hors démo 12 / 1 min

Sends a webhook.test event immediately, signed like a real one. It is never retried: the returned delivery is delivered or failed.

Integration tokens need the write ability.

Not available in demo mode: answers 403 demo_mode.

Rate limit: 12 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération firms.webhooks.test

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
webhook requisintegerId of the webhook endpoint.
ex. 3

Entêtes communs : Accept-Language

Réponses

202Test event sent.

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
Exemple
{
    "delivery": {
        "id": 1871,
        "event_id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
        "event": "entry.posted",
        "status": "pending",
        "attempts": 1,
        "next_attempt_at": "2026-03-15T09:41:00+00:00",
        "response_status": 200,
        "response_excerpt": "string",
        "duration_ms": 184,
        "delivered_at": "2026-03-15T09:41:00+00:00",
        "created_at": "2026-03-15T09:41:00+00:00",
        "payload": {
            "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
            "event": "entry.posted",
            "api_version": "v1",
            "created_at": "2026-03-15T09:41:00+00:00",
            "firm": {
                "public_token": "NDTQVQU4AUAV",
                "name": "Fiduciaire Dumont & Associés"
            },
            "company": {
                "public_token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL"
            },
            "data": {}
        },
        "attempt": 1,
        "http_status": 200
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X POST "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/test" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/test', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/test", {
  method: "POST",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.post(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/test",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/firms/{firm}/webhooks/{webhook}/deliveriesDeliveries of a webhook endpoint read

Newest first, with the status, the number of attempts and an excerpt of the answer (2000 characters max). Deliveries that are no longer pending are pruned after 30 days.

Integration tokens need the read ability.

Identifiant d'opération firms.webhooks.deliveries

Paramètres de chemin

NomTypeDescription
firm requisstringPublic token of the firm (public_token, 12 characters).
ex. NDTQVQU4AUAV
webhook requisintegerId of the webhook endpoint.
ex. 3

Paramètres de requête

NomTypeDescription
statusstring
pending delivered failed
eventstring
ex. entry.posted
pageintegerPage number, starting at 1.
ex. 1
per_pageintegerItems per page (default 25, maximum 100).
ex. 25

Entêtes communs : Accept-Language

Réponses

200OK

application/json

Schéma object
  • metaobject
    Propriétés
    • current_pageinteger
      ex. 1
    • last_pageinteger
      ex. 3
    • per_pageinteger
      ex. 25
    • totalinteger
      ex. 61
Exemple
{
    "data": [
        {
            "id": 1871,
            "event_id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
            "event": "entry.posted",
            "status": "pending",
            "attempts": 1,
            "next_attempt_at": "2026-03-15T09:41:00+00:00",
            "response_status": 200,
            "response_excerpt": "string",
            "duration_ms": 184,
            "delivered_at": "2026-03-15T09:41:00+00:00",
            "created_at": "2026-03-15T09:41:00+00:00",
            "payload": {
                "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
                "event": "entry.posted",
                "api_version": "v1",
                "created_at": "2026-03-15T09:41:00+00:00",
                "firm": {
                    "public_token": "NDTQVQU4AUAV",
                    "name": "Fiduciaire Dumont & Associés"
                },
                "company": {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL"
                },
                "data": {}
            },
            "attempt": 1,
            "http_status": 200
        }
    ],
    "meta": {
        "current_page": 1,
        "last_page": 3,
        "per_page": 25,
        "total": 61
    }
}
401Missing, invalid, revoked or expired bearer token. Error
403Authenticated but not allowed: role too low, missing token ability (token_ability_missing, session_token_required), demo restriction (demo_mode) or invalid URL signature. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/deliveries" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $NOVAFISKO_TOKEN"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/deliveries', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.getenv('NOVAFISKO_TOKEN'),
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/deliveries", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": `Bearer ${process.env.NOVAFISKO_TOKEN}`,
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/firms/NDTQVQU4AUAV/webhooks/3/deliveries",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {os.environ['NOVAFISKO_TOKEN']}",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Novadesko bridge

Endpoints reserved to the Novadesko platform (shared secret).

GET/v1/bridge/pingPing of the Novadesko bridge Public 30 / 1 min

Used by Novadesko to check the shared secret. Reserved to the Novadesko platform.

Public endpoint: no bearer token.

Rate limit: 30 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération bridge.ping

Entêtes

NomTypeDescription
X-Novafisko-Secret requisstringShared secret of the bridge.

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • okboolean
  • appstring
    ex. NovaFisko
  • timestring <date-time>
  • linked_firmsinteger
  • linked_companiesinteger
Exemple
{
    "ok": true,
    "app": "NovaFisko",
    "time": "2026-03-15T09:41:00+00:00",
    "linked_firms": 1,
    "linked_companies": 1
}
401Missing, invalid, revoked or expired bearer token. Error
429Rate limit reached. Error
503Temporarily unavailable (maintenance, external provider down). A 503 always carries a code. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/bridge/ping" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/bridge/ping', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/bridge/ping", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/bridge/ping",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None
GET/v1/bridge/shops/{token}/statusSynchronisation status of a Novadesko shop Public 60 / 1 min

Shown on the integration page of Novadesko. Reserved to the Novadesko platform (shared secret).

Public endpoint: no bearer token.

Rate limit: 60 requests per minute (429 beyond, see Retry-After).

Identifiant d'opération bridge.shop-status

Paramètres de chemin

NomTypeDescription
token requisstringToken of the Novadesko shop.
ex. shp_8fK2mQ

Entêtes

NomTypeDescription
X-Novafisko-Secret requisstringShared secret of the bridge.

Réponses

200OK

Entêtes de réponse X-RateLimit-Limit X-RateLimit-Remaining

application/json

Schéma object
  • okboolean
  • linkedboolean
  • companyobject
  • firmobject
  • synced_atstring <date-time> | null
  • documentsobject
    Propriétés
    • totalinteger
    • pendinginteger
    • bookedinteger
    • ignoredinteger
    • by_typeobject
  • bank_transactionsinteger
  • fixed_assetsinteger
  • journal_entriesinteger
  • correctionsobject
    Propriétés
    • totalinteger
    • recentobject[]
  • app_urlstring <uri>
Exemple
{
    "ok": true,
    "linked": true,
    "company": {},
    "firm": {},
    "synced_at": "2026-03-15T09:41:00+00:00",
    "documents": {
        "total": 1,
        "pending": 1,
        "booked": 1,
        "ignored": 1,
        "by_type": {}
    },
    "bank_transactions": 1,
    "fixed_assets": 1,
    "journal_entries": 1,
    "corrections": {
        "total": 1,
        "recent": [
            {}
        ]
    },
    "app_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC"
}
401Missing, invalid, revoked or expired bearer token. Error
404Unknown resource, or resource the user has no access to (a company file the user cannot see answers 404, never 403). Error
429Rate limit reached. Error

Exemple d'appel

curl -X GET "https://api.novafisko.com/v1/bridge/shops/shp_8fK2mQ/status" \
  -H "Accept: application/json"
<?php

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.novafisko.com/v1/bridge/shops/shp_8fK2mQ/status', [
    'headers' => [
        'Accept' => 'application/json',
    ],
]);

$data = json_decode((string) $response->getBody(), true);
const response = await fetch("https://api.novafisko.com/v1/bridge/shops/shp_8fK2mQ/status", {
  method: "GET",
  headers: {
    "Accept": "application/json",
  },
});

if (!response.ok) {
  const error = await response.json();
  throw new Error(error.code ?? error.message);
}
const data = response.status === 204 ? null : await response.json();
import os
import requests

response = requests.get(
    "https://api.novafisko.com/v1/bridge/shops/shp_8fK2mQ/status",
    headers={
        "Accept": "application/json",
    },
    timeout=30,
)
response.raise_for_status()
data = response.json() if response.content else None

Événements webhook

Événements envoyés en POST aux points de terminaison webhook du cabinet. Chaque envoi est signé (entête X-Novafisko-Signature).

événementdocument.importedA document entered the company file (Novadesko synchronisation or document importer).

A document entered the company file (Novadesko synchronisation or document importer).

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. document.imported
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "document.imported",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 87,
        "source": "novafisko",
        "origin": "novafisko",
        "type": "purchases",
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-04-14",
        "third_party_id": 18,
        "third_party_name": "Brasserie Dubuisson SA",
        "third_party_vat": "BE0402531376",
        "currency": "EUR",
        "amount_net": "542.00",
        "amount_vat": "113.82",
        "amount_gross": "655.82",
        "status": "pending",
        "journal_entry_id": null
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementdocument.bookedA document was booked to an entry.

A document was booked to an entry.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. document.booked
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "document.booked",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 87,
        "source": "novafisko",
        "origin": "novafisko",
        "type": "purchases",
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-04-14",
        "third_party_id": 18,
        "third_party_name": "Brasserie Dubuisson SA",
        "third_party_vat": "BE0402531376",
        "currency": "EUR",
        "amount_net": "542.00",
        "amount_vat": "113.82",
        "amount_gross": "655.82",
        "status": "booked",
        "journal_entry_id": 1284
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événemententry.postedAn entry was posted.

An entry was posted.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. entry.posted
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "entry.posted",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 1284,
        "reference": "ACH 2026/000412",
        "journal_code": "ACH",
        "fiscal_year_code": "2026",
        "number": 412,
        "entry_date": "2026-03-15",
        "due_date": "2026-04-14",
        "label": "Facture Brasserie Dubuisson SA",
        "document_reference": "F-2026-0412",
        "status": "posted",
        "origin": "manual",
        "third_party_id": 18,
        "total_debit": "655.82",
        "total_credit": "655.82",
        "lines_count": 4,
        "reversed_entry_id": null,
        "reversed_by_entry_id": null
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événemententry.reversedAn entry was reversed; `reversed_by_entry_id` is the reversal entry.

An entry was reversed; reversed_by_entry_id is the reversal entry.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. entry.reversed
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "entry.reversed",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 1284,
        "reference": "ACH 2026/000412",
        "journal_code": "ACH",
        "fiscal_year_code": "2026",
        "number": 412,
        "entry_date": "2026-03-15",
        "due_date": "2026-04-14",
        "label": "Facture Brasserie Dubuisson SA",
        "document_reference": "F-2026-0412",
        "status": "reversed",
        "origin": "manual",
        "third_party_id": 18,
        "total_debit": "655.82",
        "total_credit": "655.82",
        "lines_count": 4,
        "reversed_entry_id": null,
        "reversed_by_entry_id": 1301
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementbank.transaction_importedA bank transaction was imported (one event per transaction).

A bank transaction was imported (one event per transaction).

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. bank.transaction_imported
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "bank.transaction_imported",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 951,
        "source": "novadesko",
        "account_iban": "BE68539007547034",
        "value_date": "2026-03-18",
        "amount": "-655.82",
        "currency": "EUR",
        "counterpart_name": "Brasserie Dubuisson SA",
        "counterpart_iban": "BE71096123456769",
        "communication": "F-2026-0412",
        "status": "pending"
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementvat.declaration_validatedA VAT declaration was validated and its settlement entry posted.

A VAT declaration was validated and its settlement entry posted.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. vat.declaration_validated
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "vat.declaration_validated",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 14,
        "period_type": "quarterly",
        "year": 2026,
        "period": 1,
        "label": "1T 2026",
        "starts_on": "2026-01-01",
        "ends_on": "2026-03-31",
        "amount_due": "157.50",
        "amount_refund": "0.00",
        "status": "validated",
        "validated_at": "2026-04-14T09:02:11Z",
        "journal_entry_id": 1420
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementfiscal_year.closedA fiscal year was closed.

A fiscal year was closed.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. fiscal_year.closed
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "fiscal_year.closed",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 2,
        "code": "2025",
        "starts_on": "2025-01-01",
        "ends_on": "2025-12-31",
        "closed_at": "2026-05-28T14:30:00Z"
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementpeppol.status_changedThe Peppol registration of a company file changed status.

The Peppol registration of a company file changed status.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. peppol.status_changed
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "peppol.status_changed",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 5,
        "participant_id": "0208:0477472701",
        "full_id": "iso6523-actorid-upis::0208:0477472701",
        "status": "active",
        "previous_status": "pending",
        "incoming_enabled": true,
        "activated_at": "2026-03-02T10:15:00Z"
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementthird_party.createdA customer or supplier was created.

A customer or supplier was created.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. third_party.created
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "third_party.created",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 18,
        "type": "supplier",
        "code": "DUBUISSON",
        "name": "Brasserie Dubuisson SA",
        "vat_number": "BE0402531376",
        "enterprise_number": "0402531376",
        "country": "BE",
        "email": "compta@dubuisson.example",
        "peppol_identifier": "0208:0402531376",
        "peppol_registered": true
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementthird_party.updatedA customer or supplier was updated; `changed` lists the columns.

A customer or supplier was updated; changed lists the columns.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. third_party.updated
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "third_party.updated",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {
        "id": 18,
        "type": "supplier",
        "code": "DUBUISSON",
        "name": "Brasserie Dubuisson SA",
        "vat_number": "BE0402531376",
        "enterprise_number": "0402531376",
        "country": "BE",
        "email": "facturation@dubuisson.example",
        "peppol_identifier": "0208:0402531376",
        "peppol_registered": true,
        "changed": [
            "email"
        ]
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

événementwebhook.testTest event sent by `POST /v1/firms/{firm}/webhooks/{webhook}/test`; `company` is null.

Test event sent by POST /v1/firms/{firm}/webhooks/{webhook}/test; company is null.

Entêtes

NomTypeDescription
X-Novafisko-Signature requisstringt=<unix timestamp>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>. Compare in constant time and refuse timestamps older than five minutes.
ex. t=1791189214,v1=5d2f0c9a7b6e4d1f8a3c2b1e0f9d8c7b6a5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c
X-Novafisko-Event requisstringEvent name.
ex. webhook.test
X-Novafisko-Delivery requisstringId of the delivery (stable across retries).
ex. 1871

Charge utile

Schéma WebhookEvent

{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "webhook.test",
    "api_version": "v1",
    "created_at": "2026-10-05T08:21:48Z",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": null,
    "data": {
        "message": "Test event from NovaFisko.",
        "webhook_id": 3
    }
}

Any 2xx answer within 10 seconds acknowledges the delivery. Anything else is retried with an exponential backoff (1, 2, 4, 8, 16, 32 and 64 minutes): 8 attempts, then the delivery is failed.

Schémas

Structures de données réutilisées par les points d'accès. Les montants sont des chaînes décimales, les dates sont au format ISO 8601.

schémaAccount
  • idinteger
    ex. 580
  • company_idinteger
    ex. 7
  • numberstring
    PCMN account number (2 to 12 digits).
    ex. 702000
  • labelstring
    ex. Prestations de services
  • typestring
    asset liability expense income off_balance
  • is_postableboolean
    False for heading accounts.
  • is_reconcilableboolean
    Lettering allowed (customers, suppliers…).
  • purchase_gridinteger | null
    VAT grid of purchases: 81, 82 or 83.
    ex. 82
  • default_vat_code_idinteger | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • default_vat_codeobject | null
Exemple
{
    "id": 580,
    "company_id": 7,
    "number": "702000",
    "label": "Prestations de services",
    "type": "asset",
    "is_postable": true,
    "is_reconcilable": true,
    "purchase_grid": 82,
    "default_vat_code_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_vat_code": {}
}
schémaActivityFeed
  • current_pageinteger
    ex. 1
  • per_pageinteger
    ex. 50
  • has_moreboolean
Exemple
{
    "data": [
        {
            "source": "audit",
            "at": "2026-03-15T09:41:00+00:00",
            "recorded_at": "2026-03-15T09:41:00+00:00",
            "user": null,
            "action": "entry.posted",
            "action_label": "Écriture validée",
            "subject_type": "string",
            "subject_id": 42,
            "subject_label": "string",
            "origin": "string",
            "device_name": "MacBook de Claire",
            "revision_id": 42,
            "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
            "company_id": 7,
            "changed_fields": [
                "string"
            ],
            "company": {
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL"
            }
        }
    ],
    "current_page": 1,
    "per_page": 50,
    "has_more": true
}
schémaActivityRow
  • sourcestring
    audit revision
  • atstring <date-time>
  • recorded_atstring <date-time>
  • userobject | null
  • actionstring
    ex. entry.posted
  • action_labelstring
    ex. Écriture validée
  • subject_typestring | null
  • subject_idinteger | null
  • subject_labelstring | null
  • originstring | null
  • device_namestring | null
  • revision_idinteger | null
  • operation_idstring | null
  • company_idinteger | null
  • changed_fieldsstring[]
  • companyobject | null
    Firm feed only.
    Propriétés
    • tokenstring
    • namestring
Exemple
{
    "source": "audit",
    "at": "2026-03-15T09:41:00+00:00",
    "recorded_at": "2026-03-15T09:41:00+00:00",
    "user": {
        "id": 12,
        "name": "Claire Dumont"
    },
    "action": "entry.posted",
    "action_label": "Écriture validée",
    "subject_type": "string",
    "subject_id": 42,
    "subject_label": "string",
    "origin": "string",
    "device_name": "MacBook de Claire",
    "revision_id": 42,
    "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "company_id": 7,
    "changed_fields": [
        "string"
    ],
    "company": {
        "token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    }
}
schémaAnalyticCode
  • idinteger
    ex. 2
  • company_idinteger
  • axisstring
    cost_center project
  • codestring
    ex. SALLE
  • labelstring
    ex. Salle
  • is_activeboolean
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
Exemple
{
    "id": 2,
    "company_id": 7,
    "axis": "cost_center",
    "code": "SALLE",
    "label": "Salle",
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1
}
schémaBankRule
  • idinteger
    ex. 6
  • company_idinteger
  • namestring
    ex. Frais bancaires
  • fieldstring
    counterpart_name counterpart_iban communication description any
  • operatorstring
    contains equals starts
  • patternstring
    ex. frais de tenue
  • directionstring
    in out any
  • account_idinteger
    ex. 517
  • third_party_idinteger | null
  • labelstring | null
  • priorityinteger
    ex. 100
  • is_activeboolean
  • applied_countinteger
    ex. 14
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
  • third_partyobject | null
Exemple
{
    "id": 6,
    "company_id": 7,
    "name": "Frais bancaires",
    "field": "counterpart_name",
    "operator": "contains",
    "pattern": "frais de tenue",
    "direction": "in",
    "account_id": 517,
    "third_party_id": 18,
    "label": "Facture Brasserie Dubuisson",
    "priority": 100,
    "is_active": true,
    "applied_count": 14,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "third_party": {}
}
schémaBankTransaction
  • idinteger
    ex. 951
  • company_idinteger
    ex. 7
  • sourcestring
    ex. novadesko
  • external_idstring | null
  • account_ibanstring
    ex. BE68539007547034
  • account_bankstring | null
  • journal_idinteger | null
    ex. 7
  • amountstring <decimal>
    Positive = money in, negative = money out.
    ex. 1210.00
  • currencystring
    ex. EUR
  • value_datestring <date-time>
    ex. 2026-03-18T00:00:00.000000Z
  • execution_datestring <date-time> | null
  • counterpart_namestring | null
    ex. ACME SA
  • counterpart_ibanstring | null
  • communicationstring | null
    ex. +++000/0000/00101+++
  • descriptionstring | null
  • statusstring
    pending booked ignored
  • journal_entry_idinteger | null
  • matched_journal_entry_idinteger | null
    Invoice proposed by the matching.
  • match_confidencestring | null
    high, medium or low.
    ex. high
  • match_reasonstring | null
    structured_communication, novadesko_link, amount_and_third_party, rule…
    ex. structured_communication
  • matched_atstring <date-time> | null
  • booked_account_idinteger | null
  • matched_rule_idinteger | null
  • synced_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • journalobject | null
  • linksobject[]
  • matched_entryobject | null
  • booked_accountobject | null
  • matched_ruleobject | null
  • journal_entryobject | null
Exemple
{
    "id": 951,
    "company_id": 7,
    "source": "novadesko",
    "external_id": "string",
    "account_iban": "BE68539007547034",
    "account_bank": "string",
    "journal_id": 7,
    "amount": "1210.00",
    "currency": "EUR",
    "value_date": "2026-03-18T00:00:00.000000Z",
    "execution_date": "2026-03-15T09:41:00+00:00",
    "counterpart_name": "ACME SA",
    "counterpart_iban": "string",
    "communication": "+++000/0000/00101+++",
    "description": "Description",
    "status": "pending",
    "journal_entry_id": 1284,
    "matched_journal_entry_id": 42,
    "match_confidence": "high",
    "match_reason": "structured_communication",
    "matched_at": "2026-03-15T09:41:00+00:00",
    "booked_account_id": 42,
    "matched_rule_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {},
    "links": [
        {}
    ],
    "matched_entry": {},
    "booked_account": {},
    "matched_rule": {},
    "journal_entry": {}
}
schémaBudget
  • idinteger
  • company_idinteger
  • fiscal_year_idinteger
  • scenariostring
    ex. default
  • account_idinteger
  • cost_center_idinteger | null
  • period_numberinteger
    ex. 3
  • amountstring <decimal>
    ex. 1500.00
  • accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
Exemple
{
    "id": 42,
    "company_id": 7,
    "fiscal_year_id": 2,
    "scenario": "default",
    "account_id": 580,
    "cost_center_id": 42,
    "period_number": 3,
    "amount": "1500.00",
    "account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
schémaCodaFile
  • idinteger
    ex. 31
  • company_idinteger
  • sourcestring
    ex. novadesko
  • external_idstring | null
  • filenamestring
    ex. CODA_2026_031.cod
  • source_urlstring <uri> | null
  • account_ibanstring
    ex. BE68539007547034
  • account_bankstring | null
  • journal_idinteger | null
  • statement_numberstring | null
    ex. 031
  • sequencestring | null
  • opening_balancestring <decimal> | null
    ex. 18420.11
  • closing_balancestring <decimal> | null
    ex. 19630.11
  • period_fromstring <date-time> | null
  • period_tostring <date-time> | null
  • transactions_countinteger
    ex. 12
  • statusstring
    ex. imported
  • synced_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • journalobject | null
Exemple
{
    "id": 31,
    "company_id": 7,
    "source": "novadesko",
    "external_id": "string",
    "filename": "CODA_2026_031.cod",
    "source_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "account_iban": "BE68539007547034",
    "account_bank": "string",
    "journal_id": 3,
    "statement_number": "031",
    "sequence": "string",
    "opening_balance": "18420.11",
    "closing_balance": "19630.11",
    "period_from": "2026-03-15T09:41:00+00:00",
    "period_to": "2026-03-15T09:41:00+00:00",
    "transactions_count": 12,
    "status": "imported",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "journal": {}
}
schémaCompanyCompany file (dossier). Addressed everywhere by its `public_token`.

Company file (dossier). Addressed everywhere by its public_token.

  • idinteger
    ex. 7
  • public_tokenstring
    ex. XBVD5O1L29HC
  • firm_idinteger | null
    ex. 3
  • codestring | null
    ex. COMPTOIR
  • namestring
    ex. Le Comptoir Montois SRL
  • legal_formstring | null
    ex. SRL
  • legal_form_codestring | null
    KBO / BCE legal form code.
    ex. 610
  • enterprise_numberstring | null
    ex. 0477472701
  • vat_numberstring | null
    ex. BE0477472701
  • country_packstring
    BE FR LU
  • vat_regimestring
    monthly quarterly franchise exempt unit
  • currencystring
    ex. EUR
  • localestring
    fr nl en de
  • addressstring | null
    ex. Grand-Place 14, 7000 Mons
  • streetstring | null
    Street
    ex. Grand-Place
  • house_numberstring | null
    Number
    ex. 14
  • boxstring | null
    Box
  • postal_codestring | null
    Postal code
    ex. 7000
  • citystring | null
    City
    ex. Mons
  • countrystring | null
    ISO 3166-1 alpha-2
    ex. BE
  • latitudestring | null
    ex. 50.4541000
  • longitudestring | null
    ex. 3.9523000
  • nace_codesobject[] | null
    Propriétés
    • codestring
      ex. 56111
    • classificationstring
      MAIN SECO ANCI
  • main_nace_codestring | null
    ex. 56111
  • company_sheet_atstring <date-time> | null
  • logo_urlstring <uri> | null
  • icon_urlstring <uri> | null
  • fiscal_year_startstring <date> | null
  • fiscal_year_endstring <date> | null
  • is_activeboolean
  • is_demoboolean
    True for the company files of the demo firm.
    ex. false
  • sourcestring
    manual novadesko
  • external_idstring | null
  • synced_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • deleted_atstring <date-time> | null
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • journal_entries_countinteger
    Present on list / show.
    ex. 1284
  • firmobject
    Propriétés
    • idinteger
      ex. 3
    • public_tokenstring
      ex. NDTQVQU4AUAV
    • namestring
      ex. Fiduciaire Dumont & Associés
  • fiscal_yearsFiscalYear[]
  • journalsJournal[]
Exemple
{
    "id": 7,
    "public_token": "XBVD5O1L29HC",
    "firm_id": 3,
    "code": "COMPTOIR",
    "name": "Le Comptoir Montois SRL",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "country_pack": "BE",
    "vat_regime": "monthly",
    "currency": "EUR",
    "locale": "fr",
    "address": "Grand-Place 14, 7000 Mons",
    "street": "Grand-Place",
    "house_number": "14",
    "box": "string",
    "postal_code": "7000",
    "city": "Mons",
    "country": "BE",
    "latitude": "50.4541000",
    "longitude": "3.9523000",
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN"
        }
    ],
    "main_nace_code": "56111",
    "company_sheet_at": "2026-03-15T09:41:00+00:00",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "fiscal_year_start": "2026-03-15",
    "fiscal_year_end": "2026-03-15",
    "settings": {
        "vat": {
            "administration_cell": "string",
            "structured_communication": "000000000101",
            "directorate_number": "string",
            "office_number": "string",
            "declarant": {
                "applicable": false,
                "company_name": "string",
                "signatory_1": "string",
                "signatory_1_title": "string",
                "signatory_2": "string",
                "signatory_2_title": "string",
                "phone": "+32 65 31 42 18",
                "fax": "string",
                "email": "claire.dumont@fiduciaire-dumont.be",
                "language": "fr"
            },
            "sender_281_50": {
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "address": "Grand-Place 14",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            },
            "filer": {
                "quality": "company",
                "name": "Le Comptoir Montois SRL",
                "enterprise_number": "0477472701",
                "phone": "+32 65 31 42 18",
                "email": "claire.dumont@fiduciaire-dumont.be"
            }
        },
        "legal": {
            "rpm_district": "Hainaut, division Mons"
        },
        "annual_accounts": {
            "scheme": "abbreviated",
            "general_meeting_date": "2026-03-15",
            "directors": "string",
            "valuation_rules": "string"
        },
        "auto_entries": {
            "vat": {
                "payable_account": "451000",
                "receivable_account": "411000",
                "correction_payable_account": "string",
                "correction_receivable_account": "string",
                "journal_id": 3
            },
            "invoices_to_receive": {
                "supplier_account": "444000",
                "customer_account": "404000",
                "journal_id": 3
            },
            "reconciliation_difference": {
                "expense_account": "657000",
                "income_account": "757000",
                "max_amount": 1
            },
            "transfers": {
                "transit_account": "580000",
                "journal_id": 3
            }
        },
        "history": {
            "trash_retention_days": 90
        }
    },
    "is_active": true,
    "is_demo": false,
    "source": "manual",
    "external_id": "string",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entries_count": 1284,
    "firm": {
        "id": 3,
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "fiscal_years": [
        {
            "id": 2,
            "company_id": 7,
            "code": "2026",
            "starts_on": "2026-01-01T00:00:00.000000Z",
            "ends_on": "2026-12-31T00:00:00.000000Z",
            "is_closed": false,
            "closed_at": "2026-03-15T09:41:00+00:00",
            "closed_by": 1,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "periods": [
                {
                    "id": 16,
                    "fiscal_year_id": 2,
                    "number": 3,
                    "label": "Mars 2026",
                    "starts_on": "2026-03-15T09:41:00+00:00",
                    "ends_on": "2026-03-15T09:41:00+00:00",
                    "is_locked": false,
                    "locked_at": "2026-03-15T09:41:00+00:00",
                    "lock_version": 3,
                    "version": 3
                }
            ]
        }
    ],
    "journals": [
        {
            "id": 3,
            "company_id": 7,
            "code": "VEN",
            "label": "Ventes",
            "type": "purchase",
            "control_account_id": 42,
            "iban": "BE68539007547034",
            "bic": "GEBABEBB",
            "last_number": 412,
            "is_active": true,
            "is_default": true,
            "description": "Description",
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "entries_count": 412,
            "control_account": null,
            "rules": [
                {
                    "id": 4,
                    "company_id": 7,
                    "journal_id": 3,
                    "direction": "sale",
                    "match_field": "payment_provider",
                    "match_value": "TK",
                    "priority": 100,
                    "is_active": true,
                    "created_at": "2026-03-15T09:41:00+00:00",
                    "updated_at": "2026-03-15T09:41:00+00:00",
                    "lock_version": 3,
                    "version": 3,
                    "deleted_at": "2026-03-15T09:41:00+00:00",
                    "deleted_by": 1,
                    "journal": {
                        "id": 3,
                        "code": "VEN",
                        "label": "Ventes",
                        "type": "sale"
                    }
                }
            ]
        }
    ]
}
schémaCompanySettingsResolved settings of the company file (country pack defaults merged with the saved values).

Resolved settings of the company file (country pack defaults merged with the saved values).

  • vatobject
    Propriétés
    • administration_cellstring | null
    • structured_communicationstring | null
    • directorate_numberstring | null
    • office_numberstring | null
    • declarantobject
      Propriétés
      • applicableboolean
        ex. false
      • company_namestring | null
      • signatory_1string | null
      • signatory_1_titlestring | null
      • signatory_2string | null
      • signatory_2_titlestring | null
      • phonestring | null
      • faxstring | null
      • emailstring <email> | null
      • languagestring
        fr nl en de
    • sender_281_50object
      Propriétés
      • namestring | null
      • enterprise_numberstring | null
      • addressstring | null
      • phonestring | null
      • emailstring <email> | null
    • filerobject
      Propriétés
      • qualitystring
        company accountant
      • namestring | null
      • enterprise_numberstring | null
      • phonestring | null
      • emailstring <email> | null
  • legalobject
    Propriétés
    • rpm_districtstring | null
      RPM / RPR district printed on legal documents.
      ex. Hainaut, division Mons
  • annual_accountsobject
    Propriétés
    • schemestring
      abbreviated micro
    • general_meeting_datestring <date> | null
    • directorsstring | null
    • valuation_rulesstring | null
  • auto_entriesobject
    Propriétés
    • vatobject
      Propriétés
      • payable_accountstring
        ex. 451000
      • receivable_accountstring
        ex. 411000
      • correction_payable_accountstring | null
      • correction_receivable_accountstring | null
      • journal_idinteger | null
    • invoices_to_receiveobject
      Propriétés
      • supplier_accountstring
        ex. 444000
      • customer_accountstring
        ex. 404000
      • journal_idinteger | null
    • reconciliation_differenceobject
      Propriétés
      • expense_accountstring
        ex. 657000
      • income_accountstring
        ex. 757000
      • max_amountnumber
        ex. 1
    • transfersobject
      Propriétés
      • transit_accountstring
        ex. 580000
      • journal_idinteger | null
  • historyobject
    Propriétés
    • trash_retention_daysinteger
      ex. 90
Exemple
{
    "vat": {
        "administration_cell": "string",
        "structured_communication": "000000000101",
        "directorate_number": "string",
        "office_number": "string",
        "declarant": {
            "applicable": false,
            "company_name": "string",
            "signatory_1": "string",
            "signatory_1_title": "string",
            "signatory_2": "string",
            "signatory_2_title": "string",
            "phone": "+32 65 31 42 18",
            "fax": "string",
            "email": "claire.dumont@fiduciaire-dumont.be",
            "language": "fr"
        },
        "sender_281_50": {
            "name": "Le Comptoir Montois SRL",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "phone": "+32 65 31 42 18",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "filer": {
            "quality": "company",
            "name": "Le Comptoir Montois SRL",
            "enterprise_number": "0477472701",
            "phone": "+32 65 31 42 18",
            "email": "claire.dumont@fiduciaire-dumont.be"
        }
    },
    "legal": {
        "rpm_district": "Hainaut, division Mons"
    },
    "annual_accounts": {
        "scheme": "abbreviated",
        "general_meeting_date": "2026-03-15",
        "directors": "string",
        "valuation_rules": "string"
    },
    "auto_entries": {
        "vat": {
            "payable_account": "451000",
            "receivable_account": "411000",
            "correction_payable_account": "string",
            "correction_receivable_account": "string",
            "journal_id": 3
        },
        "invoices_to_receive": {
            "supplier_account": "444000",
            "customer_account": "404000",
            "journal_id": 3
        },
        "reconciliation_difference": {
            "expense_account": "657000",
            "income_account": "757000",
            "max_amount": 1
        },
        "transfers": {
            "transit_account": "580000",
            "journal_id": 3
        }
    },
    "history": {
        "trash_retention_days": 90
    }
}
schémaCompanySheetNormalised company sheet (CompanySearch for BE / FR, VIES elsewhere).

Normalised company sheet (CompanySearch for BE / FR, VIES elsewhere).

  • identifierstring
    ex. 0477472701
  • enterprise_numberstring | null
  • vat_numberstring | null
    ex. BE0477472701
  • namestring
    ex. Le Comptoir Montois
  • legal_formstring | null
    ex. SRL
  • legal_form_codestring | null
    ex. 610
  • statusstring | null
    ex. active
  • start_datestring <date> | null
  • addressobject
    Propriétés
    • streetstring | null
      Street
      ex. Grand-Place
    • house_numberstring | null
      Number
      ex. 14
    • boxstring | null
      Box
    • postal_codestring | null
      Postal code
      ex. 7000
    • citystring | null
      City
      ex. Mons
    • countrystring | null
      ISO 3166-1 alpha-2
      ex. BE
  • address_linestring | null
  • latitudenumber | null
  • longitudenumber | null
  • nace_codesobject[]
    Propriétés
    • codestring
      ex. 56111
    • classificationstring
      MAIN SECO ANCI
    • labelstring | null
  • main_nace_codestring | null
  • emailstring | null
  • phonestring | null
  • websitestring | null
  • sourcestring
    ex. companysearch
  • fetched_atstring <date-time> | null
  • mapobject
    Propriétés
    • querystring
      Address used for the map
      ex. Grand-Place 14, 7000 Mons, Belgique
    • apple_urlstring <uri>
    • google_urlstring <uri>
    • static_urlstring <uri> | null
    • latitudenumber | null
    • longitudenumber | null
Exemple
{
    "identifier": "0477472701",
    "enterprise_number": "0477472701",
    "vat_number": "BE0477472701",
    "name": "Le Comptoir Montois",
    "legal_form": "SRL",
    "legal_form_code": "610",
    "status": "active",
    "start_date": "2026-03-15",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "latitude": 12.5,
    "longitude": 12.5,
    "nace_codes": [
        {
            "code": "56111",
            "classification": "MAIN",
            "label": "Facture Brasserie Dubuisson"
        }
    ],
    "main_nace_code": "string",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "website": "https://www.comptoir-montois.be",
    "source": "companysearch",
    "fetched_at": "2026-03-15T09:41:00+00:00",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
schémaDepreciationLine
  • idinteger
  • fixed_asset_idinteger
    ex. 9
  • yearinteger
    ex. 2026
  • period_startstring <date-time>
  • period_endstring <date-time>
  • amountstring <decimal>
    ex. 2269.37
  • cumulative_amountstring <decimal>
    ex. 2269.37
  • remaining_valuestring <decimal>
    ex. 10130.63
  • statusstring
    planned booked
  • journal_entry_idinteger | null
  • booked_amountstring <decimal>
    ex. 0.00
Exemple
{
    "id": 42,
    "fixed_asset_id": 9,
    "year": 2026,
    "period_start": "2026-03-15T09:41:00+00:00",
    "period_end": "2026-03-15T09:41:00+00:00",
    "amount": "2269.37",
    "cumulative_amount": "2269.37",
    "remaining_value": "10130.63",
    "status": "planned",
    "journal_entry_id": 1284,
    "booked_amount": "0.00"
}
schémaDocumentImportFile uploaded to the document importer and its analysis.

File uploaded to the document importer and its analysis.

  • idinteger
    ex. 311
  • company_idinteger
    ex. 7
  • uploaded_byinteger | null
  • batch_idstring <uuid>
    Groups the files of one upload.
  • parent_import_idinteger | null
    ZIP the file was extracted from.
  • original_namestring
    ex. facture-dubuisson-0412.pdf
  • mimestring
    ex. application/pdf
  • sizeinteger
    Bytes.
    ex. 184320
  • file_hashstring
    SHA-256, used to detect duplicates.
  • kindstring
    pdf image xml zip other
  • statusstring
    queued analyzing ready needs_review validated error duplicate expanded
  • progressinteger
    0 to 100.
    ex. 100
  • stepstring
    upload text ai lines match done
  • enginestring | null
    Engine that read the file.
    ex. api
  • extractedExtractedDocument | null
  • raw_textstring | null
    Text layer (absent from lists).
  • warningsstring[] | null
  • errorstring | null
  • suggested_third_party_idinteger | null
  • suggested_directionstring | null
  • duplicate_of_import_idinteger | null
  • duplicate_of_document_idinteger | null
  • imported_document_idinteger | null
    Document created by the validation.
  • novadesko_document_idstring | null
  • novadesko_locked_atstring <date-time> | null
  • started_atstring <date-time> | null
  • finished_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • suggested_third_partyobject | null
Exemple
{
    "id": 311,
    "company_id": 7,
    "uploaded_by": 1,
    "batch_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "parent_import_id": 42,
    "original_name": "facture-dubuisson-0412.pdf",
    "mime": "application/pdf",
    "size": 184320,
    "file_hash": "string",
    "kind": "pdf",
    "status": "queued",
    "progress": 100,
    "step": "upload",
    "engine": "api",
    "extracted": {
        "direction": "purchase",
        "is_credit_note": false,
        "number": "F-2026-0412",
        "document_date": "2026-03-15",
        "due_date": "2026-03-15",
        "currency": "EUR",
        "supplier": {
            "name": "Brasserie Dubuisson SA",
            "vat_number": "BE0402531376",
            "enterprise_number": "0477472701",
            "address": "Grand-Place 14",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE",
            "iban": "BE68539007547034",
            "email": "claire.dumont@fiduciaire-dumont.be"
        },
        "customer": {},
        "amount_net": "507.00",
        "amount_vat": "106.47",
        "amount_gross": "613.47",
        "structured_communication": "000000000101",
        "confidence": 0.93,
        "lines": [
            {
                "description": "Fûts Bush Caractère 20 L",
                "quantity": 6,
                "unit_price": 84.5,
                "tax_rate": 21,
                "amount_net": "507.00",
                "amount_vat": "106.47",
                "account_id": 580,
                "account_number": "604000",
                "vat_code_id": 4,
                "vat_code": "A21"
            }
        ]
    },
    "raw_text": "string",
    "warnings": [
        "string"
    ],
    "error": "string",
    "suggested_third_party_id": 42,
    "suggested_direction": "string",
    "duplicate_of_import_id": 42,
    "duplicate_of_document_id": 42,
    "imported_document_id": 42,
    "novadesko_document_id": "string",
    "novadesko_locked_at": "2026-03-15T09:41:00+00:00",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "suggested_third_party": {}
}
schémaErrorError envelope. `message` is translated; `code` is a stable machine reason when the refusal has one; `errors`...

Error envelope. message is translated; code is a stable machine reason when the refusal has one; errors maps fields to messages (422).

  • messagestringrequis
    Human-readable message (translated).
    ex. Le champ date de l'écriture est obligatoire.
  • codestring
    Machine reason (token_ability_missing, session_token_required, demo_mode, conflict, period_locked, company_limit_reached, service_unavailable…).
    ex. period_locked
  • errorsobject
    Field => list of messages.
Exemple
{
    "message": "Le champ date de l'écriture est obligatoire.",
    "code": "period_locked",
    "errors": {
        "entry_date": [
            "La période Mars 2026 est verrouillée."
        ]
    }
}
schémaExtractedDocumentData read from an uploaded file (AI extraction or UBL / CII parsing), editable before validation.

Data read from an uploaded file (AI extraction or UBL / CII parsing), editable before validation.

  • directionstring
    purchase sale
  • is_credit_noteboolean
    ex. false
  • numberstring | null
    ex. F-2026-0412
  • document_datestring <date> | null
  • due_datestring <date> | null
  • currencystring
    ex. EUR
  • supplierobject
    Propriétés
    • namestring | null
      ex. Brasserie Dubuisson SA
    • vat_numberstring | null
      ex. BE0402531376
    • enterprise_numberstring | null
    • addressstring | null
    • postal_codestring | null
    • citystring | null
    • countrystring | null
    • ibanstring | null
    • emailstring | null
  • customerobject | null
  • amount_netstring | null
    ex. 507.00
  • amount_vatstring | null
    ex. 106.47
  • amount_grossstring | null
    ex. 613.47
  • structured_communicationstring | null
  • confidencenumber
    0 to 1; below 0.6 the import needs a review.
    ex. 0.93
  • linesobject[]
    Propriétés
    • descriptionstring
      ex. Fûts Bush Caractère 20 L
    • quantitynumber | null
      ex. 6
    • unit_pricenumber | null
      ex. 84.5
    • tax_ratenumber | null
      ex. 21
    • amount_netstring
      ex. 507.00
    • amount_vatstring | null
      ex. 106.47
    • account_idinteger | null
      Suggested account.
    • account_numberstring | null
      ex. 604000
    • vat_code_idinteger | null
    • vat_codestring | null
      ex. A21
Exemple
{
    "direction": "purchase",
    "is_credit_note": false,
    "number": "F-2026-0412",
    "document_date": "2026-03-15",
    "due_date": "2026-03-15",
    "currency": "EUR",
    "supplier": {
        "name": "Brasserie Dubuisson SA",
        "vat_number": "BE0402531376",
        "enterprise_number": "0477472701",
        "address": "Grand-Place 14",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE",
        "iban": "BE68539007547034",
        "email": "claire.dumont@fiduciaire-dumont.be"
    },
    "customer": {},
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "amount_gross": "613.47",
    "structured_communication": "000000000101",
    "confidence": 0.93,
    "lines": [
        {
            "description": "Fûts Bush Caractère 20 L",
            "quantity": 6,
            "unit_price": 84.5,
            "tax_rate": 21,
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "account_id": 580,
            "account_number": "604000",
            "vat_code_id": 4,
            "vat_code": "A21"
        }
    ]
}
schémaFirmAccounting firm (fiduciary) with its team and company files.

Accounting firm (fiduciary) with its team and company files.

  • public_tokenstring
    ex. NDTQVQU4AUAV
  • namestring
    ex. Fiduciaire Dumont & Associés
  • enterprise_numberstring | null
    ex. 0458662817
  • vat_numberstring | null
    ex. BE0458662817
  • itaa_numberstring | null
    ITAA membership number.
    ex. 50.123.456
  • itaa_statusstring | null
  • itaa_qualitystring | null
  • addressstring | null
    ex. Rue de Nimy 52
  • postal_codestring | null
    ex. 7000
  • citystring | null
    ex. Mons
  • websitestring | null
  • logo_urlstring <uri> | null
  • is_partnerboolean
  • country_codestring
    ex. BE
  • localestring
    fr nl en de
  • emailstring <email> | null
  • phonestring | null
  • sourcestring
    local novadesko
  • synced_atstring <date-time> | null
  • can_manageboolean
    True for admins and managers of the firm.
  • membersFirmMember[]
  • companiesobject[]
    Propriétés
    • public_tokenstring
    • namestring
    • codestring | null
    • icon_urlstring <uri> | null
    • logo_urlstring <uri> | null
    • membersobject[]
      Propriétés
      • idinteger
      • namestring
        ex. Thomas Peeters
      • emailstring <email>
      • rolestring
        manager encoder reviewer
      • is_activeboolean
Exemple
{
    "public_token": "NDTQVQU4AUAV",
    "name": "Fiduciaire Dumont & Associés",
    "enterprise_number": "0458662817",
    "vat_number": "BE0458662817",
    "itaa_number": "50.123.456",
    "itaa_status": "string",
    "itaa_quality": "string",
    "address": "Rue de Nimy 52",
    "postal_code": "7000",
    "city": "Mons",
    "website": "https://www.comptoir-montois.be",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "is_partner": true,
    "country_code": "BE",
    "locale": "fr",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "phone": "+32 65 31 42 18",
    "source": "local",
    "synced_at": "2026-03-15T09:41:00+00:00",
    "can_manage": true,
    "members": [
        {
            "id": 12,
            "name": "Thomas Peeters",
            "email": "thomas.peeters@fiduciaire-dumont.be",
            "auth_source": "local",
            "locale": "fr",
            "role": "admin",
            "is_active": true,
            "all_companies": true,
            "companies": [
                {
                    "public_token": "XBVD5O1L29HC",
                    "name": "Le Comptoir Montois SRL",
                    "code": "COMPTOIR",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ],
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "icon_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "members": [
                {
                    "id": 42,
                    "name": "Thomas Peeters",
                    "email": "claire.dumont@fiduciaire-dumont.be",
                    "role": "manager",
                    "is_active": true
                }
            ]
        }
    ]
}
schémaFirmMember
  • idinteger
    ex. 12
  • namestring
    ex. Thomas Peeters
  • emailstring <email>
    ex. thomas.peeters@fiduciaire-dumont.be
  • auth_sourcestring
    local novadesko
  • localestring
    fr nl en de
  • rolestring
    admin manager encoder reviewer
  • is_activeboolean
  • all_companiesboolean
    Admins and managers see every company file of the firm.
  • companiesobject[]
    Propriétés
    • public_tokenstring
    • namestring
    • codestring | null
    • rolestring
      manager encoder reviewer
    • is_activeboolean
Exemple
{
    "id": 12,
    "name": "Thomas Peeters",
    "email": "thomas.peeters@fiduciaire-dumont.be",
    "auth_source": "local",
    "locale": "fr",
    "role": "admin",
    "is_active": true,
    "all_companies": true,
    "companies": [
        {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL",
            "code": "COMPTOIR",
            "role": "manager",
            "is_active": true
        }
    ]
}
schémaFiscalYear
  • idinteger
    ex. 2
  • company_idinteger
    ex. 7
  • codestring
    ex. 2026
  • starts_onstring <date-time>
    ex. 2026-01-01T00:00:00.000000Z
  • ends_onstring <date-time>
    ex. 2026-12-31T00:00:00.000000Z
  • is_closedboolean
    ex. false
  • closed_atstring <date-time> | null
  • closed_byinteger | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • periodsPeriod[]
Exemple
{
    "id": 2,
    "company_id": 7,
    "code": "2026",
    "starts_on": "2026-01-01T00:00:00.000000Z",
    "ends_on": "2026-12-31T00:00:00.000000Z",
    "is_closed": false,
    "closed_at": "2026-03-15T09:41:00+00:00",
    "closed_by": 1,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "periods": [
        {
            "id": 16,
            "fiscal_year_id": 2,
            "number": 3,
            "label": "Mars 2026",
            "starts_on": "2026-03-15T09:41:00+00:00",
            "ends_on": "2026-03-15T09:41:00+00:00",
            "is_locked": false,
            "locked_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3
        }
    ]
}
schémaFixedAsset
  • idinteger
    ex. 9
  • company_idinteger
  • sourcestring
    manual novadesko
  • external_idstring | null
  • referencestring | null
    ex. IMM-2026-003
  • namestring
    ex. Four mixte Rational
  • categorystring
    it_equipment vehicle furniture machinery building software other
  • asset_groupstring | null
  • asset_account_idinteger | null
  • depreciation_account_idinteger | null
  • expense_account_idinteger | null
  • imported_document_idinteger | null
  • acquisition_datestring <date-time>
    ex. 2026-02-01T00:00:00.000000Z
  • acquisition_coststring <decimal>
    ex. 12400.00
  • residual_valuestring <decimal>
    ex. 0.00
  • useful_life_yearsinteger
    ex. 5
  • methodstring
    linear declining
  • prorata_temporisboolean
  • start_datestring <date-time>
  • statusstring
    active fully_depreciated disposed
  • notesstring | null
  • disposed_onstring <date-time> | null
  • disposal_pricestring <decimal> | null
  • disposal_entry_idinteger | null
  • investment_deduction_pctstring <decimal> | null
  • investment_deduction_spreadboolean
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • asset_accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
  • depreciation_accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
  • expense_accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
Exemple
{
    "id": 9,
    "company_id": 7,
    "source": "manual",
    "external_id": "string",
    "reference": "IMM-2026-003",
    "name": "Four mixte Rational",
    "category": "it_equipment",
    "asset_group": "string",
    "asset_account_id": 42,
    "depreciation_account_id": 42,
    "expense_account_id": 42,
    "imported_document_id": 42,
    "acquisition_date": "2026-02-01T00:00:00.000000Z",
    "acquisition_cost": "12400.00",
    "residual_value": "0.00",
    "useful_life_years": 5,
    "method": "linear",
    "prorata_temporis": true,
    "start_date": "2026-03-15T09:41:00+00:00",
    "status": "active",
    "notes": "string",
    "disposed_on": "2026-03-15T09:41:00+00:00",
    "disposal_price": "1210.00",
    "disposal_entry_id": 42,
    "investment_deduction_pct": "1210.00",
    "investment_deduction_spread": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "lines": [
        {
            "id": 42,
            "fixed_asset_id": 9,
            "year": 2026,
            "period_start": "2026-03-15T09:41:00+00:00",
            "period_end": "2026-03-15T09:41:00+00:00",
            "amount": "2269.37",
            "cumulative_amount": "2269.37",
            "remaining_value": "10130.63",
            "status": "planned",
            "journal_entry_id": 1284,
            "booked_amount": "0.00"
        }
    ],
    "asset_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "depreciation_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "expense_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    }
}
schémaImportedDocumentInvoice, credit note or receipt of the company file: synchronised from Novadesko or created by the document im...

Invoice, credit note or receipt of the company file: synchronised from Novadesko or created by the document importer.

  • idinteger
    ex. 87
  • company_idinteger
    ex. 7
  • sourcestring
    ex. novadesko
  • originstring | null
    novafisko when created by the importer.
  • external_idstring | null
  • typestring
    purchases, invoices, credit_notes, receipts…
    ex. purchases
  • directionstring
    sale purchase
  • is_credit_noteboolean
    ex. false
  • naturestring | null
  • numberstring | null
    ex. F-2026-0412
  • payment_providerstring | null
  • number_seriesstring | null
  • document_datestring <date-time>
    ex. 2026-03-15T00:00:00.000000Z
  • due_datestring <date-time> | null
  • subjectstring | null
  • communicationstring | null
  • currencystring
    ex. EUR
  • amount_netstring <decimal>
    ex. 507.00
  • amount_vatstring <decimal>
    ex. 106.47
  • amount_grossstring <decimal>
    ex. 613.47
  • is_paidboolean
  • third_party_idinteger | null
  • third_party_namestring | null
    ex. Brasserie Dubuisson SA
  • third_party_vatstring | null
  • pdf_urlstring <uri> | null
  • xml_urlstring <uri> | null
  • statusstring
    pending booked ignored
  • journal_entry_idinteger | null
  • accountant_lockedboolean
    Locked for the shop: only the accountant can change it.
  • novadesko_push_statusstring | null
  • novadesko_pushed_atstring <date-time> | null
  • novadesko_push_errorstring | null
  • document_import_idinteger | null
  • synced_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • third_partyobject | null
  • journal_entryJournalEntry | null
Exemple
{
    "id": 87,
    "company_id": 7,
    "source": "novadesko",
    "origin": "string",
    "external_id": "string",
    "type": "purchases",
    "direction": "sale",
    "is_credit_note": false,
    "nature": "string",
    "number": "F-2026-0412",
    "payment_provider": "string",
    "number_series": "TK",
    "document_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "subject": "Vos documents comptables",
    "communication": "string",
    "currency": "EUR",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "amount_gross": "613.47",
    "is_paid": true,
    "third_party_id": 18,
    "third_party_name": "Brasserie Dubuisson SA",
    "third_party_vat": "string",
    "pdf_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "xml_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "pending",
    "journal_entry_id": 1284,
    "accountant_locked": true,
    "novadesko_push_status": "string",
    "novadesko_pushed_at": "2026-03-15T09:41:00+00:00",
    "novadesko_push_error": "string",
    "document_import_id": 42,
    "synced_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "third_party": {},
    "lines": [
        {
            "id": 640,
            "imported_document_id": 87,
            "external_id": "string",
            "position": 1,
            "description": "Fûts Bush Caractère 20 L",
            "quantity": "6.000",
            "unit_price": "84.5000",
            "discount_pct": "1210.00",
            "tax_rate": "21.00",
            "amount_net": "507.00",
            "amount_vat": "106.47",
            "recorded_account_number": "604000",
            "recorded_account_id": 42,
            "actual_account_id": 42,
            "vat_code_id": 4,
            "purchase_category": "string",
            "corrected_at": "2026-03-15T09:41:00+00:00",
            "corrected_by": 1,
            "correction_pushed": true,
            "recorded_account": {},
            "actual_account": {},
            "vat_code": {}
        }
    ],
    "journal_entry": {
        "id": 1284,
        "company_id": 7,
        "fiscal_year_id": 2,
        "period_id": 16,
        "journal_id": 3,
        "number": 412,
        "entry_date": "2026-03-15T00:00:00.000000Z",
        "due_date": "2026-03-15T09:41:00+00:00",
        "label": "Facture Brasserie Dubuisson SA",
        "reference": "F-2026-0412",
        "structured_communication": "000000000101",
        "third_party_id": 18,
        "status": "posted",
        "origin": "manual",
        "created_by": 1,
        "posted_at": "2026-03-15T09:41:00+00:00",
        "reversed_entry_id": 42,
        "reversed_by_entry_id": 42,
        "recurring_entry_id": 42,
        "created_at": "2026-03-15T09:41:00+00:00",
        "updated_at": "2026-03-15T09:41:00+00:00",
        "lock_version": 3,
        "version": 3,
        "journal": {
            "id": 3,
            "code": "VEN",
            "type": "sale"
        },
        "third_party": {
            "id": 18,
            "name": "Brasserie Dubuisson SA"
        },
        "lines": [
            {
                "id": 3391,
                "journal_entry_id": 1284,
                "position": 1,
                "account_id": 580,
                "third_party_id": 18,
                "label": "Brasserie Dubuisson SA",
                "debit": "0.00",
                "credit": "1000.00",
                "vat_code_id": 4,
                "vat_base": "1000.00",
                "reconciliation_code": "AB",
                "cost_center_id": 42,
                "project_id": 42,
                "reminder_level": 0,
                "reminder_sent_at": "2026-03-15T09:41:00+00:00",
                "account": {
                    "id": 580,
                    "number": "702000",
                    "label": "Prestations de services"
                },
                "vat_code": {}
            }
        ]
    }
}
schémaImportedDocumentLine
  • idinteger
    ex. 640
  • imported_document_idinteger
    ex. 87
  • external_idstring | null
  • positioninteger
    ex. 1
  • descriptionstring | null
    ex. Fûts Bush Caractère 20 L
  • quantitystring | null
    ex. 6.000
  • unit_pricestring | null
    ex. 84.5000
  • discount_pctstring <decimal> | null
  • tax_ratestring <decimal> | null
    ex. 21.00
  • amount_netstring <decimal>
    ex. 507.00
  • amount_vatstring <decimal>
    ex. 106.47
  • recorded_account_numberstring | null
    Account as encoded at the source (« recorded » layer).
    ex. 604000
  • recorded_account_idinteger | null
  • actual_account_idinteger | null
    Account chosen by the accountant (« actual » layer).
  • vat_code_idinteger | null
  • purchase_categorystring | null
  • corrected_atstring <date-time> | null
  • corrected_byinteger | null
  • correction_pushedboolean
  • recorded_accountobject | null
  • actual_accountobject | null
  • vat_codeobject | null
Exemple
{
    "id": 640,
    "imported_document_id": 87,
    "external_id": "string",
    "position": 1,
    "description": "Fûts Bush Caractère 20 L",
    "quantity": "6.000",
    "unit_price": "84.5000",
    "discount_pct": "1210.00",
    "tax_rate": "21.00",
    "amount_net": "507.00",
    "amount_vat": "106.47",
    "recorded_account_number": "604000",
    "recorded_account_id": 42,
    "actual_account_id": 42,
    "vat_code_id": 4,
    "purchase_category": "string",
    "corrected_at": "2026-03-15T09:41:00+00:00",
    "corrected_by": 1,
    "correction_pushed": true,
    "recorded_account": {},
    "actual_account": {},
    "vat_code": {}
}
schémaIntegration
  • slugstring
    ex. novadesko
  • namestring
    ex. Novadesko
  • categorystring
    accounting banking e_invoicing documents payments api
  • descriptionstring
  • logo_urlstring <uri> | null
  • statusstring
    available beta coming_soon
  • capabilitiesstring[]
    import_documents import_bank import_assets export_entries e_invoicing
  • config_schemaobject[]
    Propriétés
    • keystring
    • labelstring
    • typestring
      text secret select bool
    • requiredboolean
  • open_tabstring | null
  • has_driverboolean
  • is_enabledboolean
  • connectionobject | null
    Propriétés
    • is_activeboolean
    • statusstring
      connected disconnected error
    • config_maskedobject
    • last_sync_atstring <date-time> | null
    • last_errorstring | null
  • interestedboolean
  • actionsstring[]
Exemple
{
    "slug": "novadesko",
    "name": "Novadesko",
    "category": "accounting",
    "description": "Description",
    "logo_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "status": "available",
    "capabilities": [
        "import_documents"
    ],
    "config_schema": [
        {
            "key": "string",
            "label": "Facture Brasserie Dubuisson",
            "type": "text",
            "required": true
        }
    ],
    "open_tab": "string",
    "has_driver": true,
    "is_enabled": true,
    "connection": {
        "is_active": true,
        "status": "connected",
        "config_masked": {},
        "last_sync_at": "2026-03-15T09:41:00+00:00",
        "last_error": "string"
    },
    "interested": true,
    "actions": [
        "string"
    ]
}
schémaIntegrationRun
  • idinteger
    ex. 77
  • statusstring
    running success error
  • started_atstring <date-time> | null
  • finished_atstring <date-time> | null
  • duration_msinteger | null
    ex. 1840
  • summaryobject | null
  • messagestring | null
Exemple
{
    "id": 77,
    "status": "running",
    "started_at": "2026-03-15T09:41:00+00:00",
    "finished_at": "2026-03-15T09:41:00+00:00",
    "duration_ms": 1840,
    "summary": {},
    "message": "OK"
}
schémaIntegrationTokenIntegration token (the secret is only returned once, by the creation).

Integration token (the secret is only returned once, by the creation).

  • idinteger
    ex. 57
  • namestring
    ex. ERP connector
  • abilitiesstring[]
    read write sync
  • created_atstring <date-time>
  • expires_atstring <date-time> | null
  • last_used_atstring <date-time> | null
Exemple
{
    "id": 57,
    "name": "ERP connector",
    "abilities": [
        "read"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "expires_at": "2026-03-15T09:41:00+00:00",
    "last_used_at": "2026-03-15T09:41:00+00:00"
}
schémaJournal
  • idinteger
    ex. 3
  • company_idinteger
    ex. 7
  • codestring
    ex. VEN
  • labelstring
    ex. Ventes
  • typestring
    purchase sale purchase_credit_note sale_credit_note financial miscellaneous
  • control_account_idinteger | null
  • ibanstring | null
  • bicstring | null
  • last_numberinteger
    ex. 412
  • is_activeboolean
  • is_defaultboolean
  • descriptionstring | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • entries_countinteger
    ex. 412
  • control_accountobject | null
Exemple
{
    "id": 3,
    "company_id": 7,
    "code": "VEN",
    "label": "Ventes",
    "type": "purchase",
    "control_account_id": 42,
    "iban": "BE68539007547034",
    "bic": "GEBABEBB",
    "last_number": 412,
    "is_active": true,
    "is_default": true,
    "description": "Description",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "entries_count": 412,
    "control_account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "rules": [
        {
            "id": 4,
            "company_id": 7,
            "journal_id": 3,
            "direction": "sale",
            "match_field": "payment_provider",
            "match_value": "TK",
            "priority": 100,
            "is_active": true,
            "created_at": "2026-03-15T09:41:00+00:00",
            "updated_at": "2026-03-15T09:41:00+00:00",
            "lock_version": 3,
            "version": 3,
            "deleted_at": "2026-03-15T09:41:00+00:00",
            "deleted_by": 1,
            "journal": {
                "id": 3,
                "code": "VEN",
                "label": "Ventes",
                "type": "sale"
            }
        }
    ]
}
schémaJournalEntryPosted accounting entry. A posted entry is never modified nor deleted: it is reversed.

Posted accounting entry. A posted entry is never modified nor deleted: it is reversed.

  • idinteger
    ex. 1284
  • company_idinteger
    ex. 7
  • fiscal_year_idinteger
    ex. 2
  • period_idinteger
    ex. 16
  • journal_idinteger
    ex. 3
  • numberinteger
    Continuous number in the journal and fiscal year.
    ex. 412
  • entry_datestring <date-time>
    ex. 2026-03-15T00:00:00.000000Z
  • due_datestring <date-time> | null
  • labelstring
    ex. Facture Brasserie Dubuisson SA
  • referencestring | null
    Document number.
    ex. F-2026-0412
  • structured_communicationstring | null
    12 digits, without +++ and /.
    ex. 000000000101
  • third_party_idinteger | null
    ex. 18
  • statusstring
    posted reversed
  • originstring
    manual, import, bank, recurring, depreciation, vat, year_end…
    ex. manual
  • created_byinteger | null
  • posted_atstring <date-time>
  • reversed_entry_idinteger | null
    Entry this one reverses.
  • reversed_by_entry_idinteger | null
    Entry that reversed this one.
  • recurring_entry_idinteger | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • journalobject
    Propriétés
    • idinteger
      ex. 3
    • codestring
      ex. VEN
    • typestring
      ex. sale
  • third_partyobject
    Propriétés
    • idinteger
      ex. 18
    • namestring
      ex. Brasserie Dubuisson SA
Exemple
{
    "id": 1284,
    "company_id": 7,
    "fiscal_year_id": 2,
    "period_id": 16,
    "journal_id": 3,
    "number": 412,
    "entry_date": "2026-03-15T00:00:00.000000Z",
    "due_date": "2026-03-15T09:41:00+00:00",
    "label": "Facture Brasserie Dubuisson SA",
    "reference": "F-2026-0412",
    "structured_communication": "000000000101",
    "third_party_id": 18,
    "status": "posted",
    "origin": "manual",
    "created_by": 1,
    "posted_at": "2026-03-15T09:41:00+00:00",
    "reversed_entry_id": 42,
    "reversed_by_entry_id": 42,
    "recurring_entry_id": 42,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal": {
        "id": 3,
        "code": "VEN",
        "type": "sale"
    },
    "third_party": {
        "id": 18,
        "name": "Brasserie Dubuisson SA"
    },
    "lines": [
        {
            "id": 3391,
            "journal_entry_id": 1284,
            "position": 1,
            "account_id": 580,
            "third_party_id": 18,
            "label": "Brasserie Dubuisson SA",
            "debit": "0.00",
            "credit": "1000.00",
            "vat_code_id": 4,
            "vat_base": "1000.00",
            "reconciliation_code": "AB",
            "cost_center_id": 42,
            "project_id": 42,
            "reminder_level": 0,
            "reminder_sent_at": "2026-03-15T09:41:00+00:00",
            "account": {
                "id": 580,
                "number": "702000",
                "label": "Prestations de services"
            },
            "vat_code": {}
        }
    ]
}
schémaJournalEntryLine
  • idinteger
    ex. 3391
  • journal_entry_idinteger
    ex. 1284
  • positioninteger
    ex. 1
  • account_idinteger
    ex. 580
  • third_party_idinteger | null
  • labelstring | null
    ex. Brasserie Dubuisson SA
  • debitstring <decimal>
    ex. 0.00
  • creditstring <decimal>
    ex. 1000.00
  • vat_code_idinteger | null
    ex. 4
  • vat_basestring <decimal> | null
    ex. 1000.00
  • reconciliation_codestring | null
    Lettering code.
    ex. AB
  • cost_center_idinteger | null
  • project_idinteger | null
  • reminder_levelinteger
    ex. 0
  • reminder_sent_atstring <date-time> | null
  • accountobject
    Propriétés
    • idinteger
      Id
      ex. 580
    • numberstring
      Account number
      ex. 702000
    • labelstring
      Label
      ex. Prestations de services
  • vat_codeobject | null
Exemple
{
    "id": 3391,
    "journal_entry_id": 1284,
    "position": 1,
    "account_id": 580,
    "third_party_id": 18,
    "label": "Brasserie Dubuisson SA",
    "debit": "0.00",
    "credit": "1000.00",
    "vat_code_id": 4,
    "vat_base": "1000.00",
    "reconciliation_code": "AB",
    "cost_center_id": 42,
    "project_id": 42,
    "reminder_level": 0,
    "reminder_sent_at": "2026-03-15T09:41:00+00:00",
    "account": {
        "id": 580,
        "number": "702000",
        "label": "Prestations de services"
    },
    "vat_code": {}
}
schémaJournalRuleRoutes imported documents to a journal according to their numbering series, payment provider or third party.

Routes imported documents to a journal according to their numbering series, payment provider or third party.

  • idinteger
    ex. 4
  • company_idinteger
  • journal_idinteger
    ex. 3
  • directionstring
    sale purchase
  • match_fieldstring
    payment_provider number_series number_prefix third_party
  • match_valuestring
    ex. TK
  • priorityinteger
    ex. 100
  • is_activeboolean
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • journalobject
    Propriétés
    • idinteger
      ex. 3
    • codestring
      ex. VEN
    • labelstring
      ex. Ventes
    • typestring
      ex. sale
Exemple
{
    "id": 4,
    "company_id": 7,
    "journal_id": 3,
    "direction": "sale",
    "match_field": "payment_provider",
    "match_value": "TK",
    "priority": 100,
    "is_active": true,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 3,
        "code": "VEN",
        "label": "Ventes",
        "type": "sale"
    }
}
schémaLicenceLicence and subscription of the firm: plan, status, usage of the month, estimate, last statements.

Licence and subscription of the firm: plan, status, usage of the month, estimate, last statements.

  • statusstring
    none trial active past_due suspended cancelled
  • subscriptionobject | null
  • planobject | null
  • usageobject
    Propriétés
    • monthstring
      ex. 2026-10
    • companiesinteger
      ex. 25
    • usersinteger
      ex. 4
    • bank_accountsinteger
      ex. 31
    • rowsobject[]
      Propriétés
      • company_idinteger
      • tokenstring
      • namestring
      • codestring | null
      • bank_accountsinteger
        ex. 1
      • statusstring
        ex. active
      • activated_atstring <date-time>
      • deactivated_atstring <date-time> | null
    • max_companiesinteger | null
    • over_limitboolean
      ex. false
    • suggestionstring | null
  • estimateobject | null
    Estimated invoice of the month (excl. VAT).
  • companies_detailobject[]
    Propriétés
    • company_idinteger
    • namestring
    • public_tokenstring
    • statusstring
      ex. active
    • activated_atstring <date-time>
    • deactivated_atstring <date-time> | null
    • billableboolean
  • next_month_previewobject
    Propriétés
    • companiesinteger
      ex. 25
    • totalnumber
      ex. 121.5
  • over_limitboolean
    ex. false
  • over_limit_firm_totalnumber | null
  • entitlementsobject
    Propriétés
    • accountingboolean
    • peppolboolean
    • codaboolean
    • client_portalboolean
    • client_invoicingboolean
    • document_importboolean
  • limitsobject
    Propriétés
    • max_usersinteger | null
    • max_companiesinteger | null
    • users_countinteger
      ex. 4
    • companies_countinteger
      ex. 25
  • expires_atstring <date-time> | null
  • warningstring | null
  • activationobject | null
    Active licence key (masked) when the subscription comes from a key.
  • statementsobject[]
  • options_availableobject[]
    Propriétés
    • codestring
      client_portal client_invoicing
    • namestring
      ex. Portail client
    • price_monthlynumber
      ex. 6.9
    • unitstring
      ex. client
  • can_manageboolean
Exemple
{
    "status": "none",
    "subscription": {},
    "plan": {},
    "usage": {
        "month": "2026-10",
        "companies": 25,
        "users": 4,
        "bank_accounts": 31,
        "rows": [
            {
                "company_id": 7,
                "token": "XBVD5O1L29HC",
                "name": "Le Comptoir Montois SRL",
                "code": "COMPTOIR",
                "bank_accounts": 1,
                "status": "active",
                "activated_at": "2026-03-15T09:41:00+00:00",
                "deactivated_at": "2026-03-15T09:41:00+00:00"
            }
        ],
        "max_companies": 1,
        "over_limit": false,
        "suggestion": "string"
    },
    "estimate": {},
    "companies_detail": [
        {
            "company_id": 7,
            "name": "Le Comptoir Montois SRL",
            "public_token": "XBVD5O1L29HC",
            "status": "active",
            "activated_at": "2026-03-15T09:41:00+00:00",
            "deactivated_at": "2026-03-15T09:41:00+00:00",
            "billable": true
        }
    ],
    "next_month_preview": {
        "companies": 25,
        "total": 121.5
    },
    "over_limit": false,
    "over_limit_firm_total": 12.5,
    "entitlements": {
        "accounting": true,
        "peppol": true,
        "coda": true,
        "client_portal": true,
        "client_invoicing": true,
        "document_import": true
    },
    "limits": {
        "max_users": 1,
        "max_companies": 1,
        "users_count": 4,
        "companies_count": 25
    },
    "expires_at": "2026-03-15T09:41:00+00:00",
    "warning": "string",
    "activation": {},
    "statements": [
        {}
    ],
    "options_available": [
        {
            "code": "client_portal",
            "name": "Portail client",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "can_manage": true
}
schémaMailLog
  • idinteger
    ex. 9012
  • template_keystring
    ex. documents.send
  • tostring <email>
    ex. gerant@comptoir-montois.example
  • subjectstring
    ex. Vos documents comptables
  • statusstring
    queued sent failed bounced
  • localestring
    ex. fr
  • created_atstring <date-time>
  • sent_atstring <date-time> | null
  • opened_atstring <date-time> | null
  • attachmentsobject[]
    Propriétés
    • namestring
      ex. balance-2026.pdf
    • sizeinteger
      ex. 48211
Exemple
{
    "id": 9012,
    "template_key": "documents.send",
    "to": "gerant@comptoir-montois.example",
    "subject": "Vos documents comptables",
    "status": "queued",
    "locale": "fr",
    "created_at": "2026-03-15T09:41:00+00:00",
    "sent_at": "2026-03-15T09:41:00+00:00",
    "opened_at": "2026-03-15T09:41:00+00:00",
    "attachments": [
        {
            "name": "balance-2026.pdf",
            "size": 48211
        }
    ]
}
schémaMessage
  • messagestring
    Translated confirmation.
    ex. Mot de passe modifié.
Exemple
{
    "message": "Mot de passe modifié."
}
schémaPaginationLaravel length-aware pagination envelope; `data` holds the items.

Laravel length-aware pagination envelope; data holds the items.

  • current_pageinteger
    ex. 1
  • dataany[]
  • first_page_urlstring <uri> | null
  • frominteger | null
    ex. 1
  • last_pageinteger
    ex. 4
  • last_page_urlstring <uri> | null
  • linksobject[]
    Propriétés
    • urlstring <uri> | null
    • labelstring
      ex. 1
    • pageinteger | null
    • activeboolean
  • next_page_urlstring <uri> | null
  • pathstring <uri>
  • per_pageinteger
    ex. 50
  • prev_page_urlstring <uri> | null
  • tointeger | null
    ex. 50
  • totalinteger
    ex. 187
Exemple
{
    "current_page": 1,
    "data": [
        null
    ],
    "first_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "from": 1,
    "last_page": 4,
    "last_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "links": [
        {
            "url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "label": "1",
            "page": 1,
            "active": true
        }
    ],
    "next_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "path": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "per_page": 50,
    "prev_page_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "to": 50,
    "total": 187
}
schémaPeppolAccessPoint
  • smp_hoststring | null
    ex. smp.b2brouter.net
  • provider_namestring | null
    ex. B2Brouter
  • endpoint_urlstring <uri> | null
  • technical_contactstring | null
Exemple
{
    "smp_host": "smp.b2brouter.net",
    "provider_name": "B2Brouter",
    "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
    "technical_contact": "string"
}
schémaPeppolDocumentType
  • idstring
    ex. bis_billing_invoice
  • namestring
    ex. Invoice BIS Billing 3.0
  • familystring
    ex. billing
  • descriptionstring
    ex. Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.
  • document_idstring
    Full Peppol document type identifier.
Exemple
{
    "id": "bis_billing_invoice",
    "name": "Invoice BIS Billing 3.0",
    "family": "billing",
    "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
    "document_id": "string"
}
schémaPeppolStatePeppol registration state of a company file.

Peppol registration state of a company file.

  • identityobject | null
    Raw registration record.
  • participant_idstring | null
    ex. 0208:0477472701
  • statusstring
    none pending active inactive deleted error external
  • accountobject | null
    Propriétés
    • idstring
    • namestring | null
    • archivedboolean
  • transportobject | null
    Transport options: enabled, reception, standard_documents, invoice, credit_note, self_billing, order, application_response.
  • smpobject
    Propriétés
    • publishedboolean
    • checked_atstring <date-time> | null
  • access_pointPeppolAccessPoint
  • supported_documentsPeppolDocumentType[]
  • can_registerboolean
  • blockersstring[]
  • blocker_codesstring[]
  • managed_by_novadeskoboolean
  • registered_elsewhereboolean
    The participant is already published by another access point.
  • external_providerstring | null
  • provider_configuredboolean
  • environmentstring
    production staging
  • contactobject
  • last_errorstring | null
Exemple
{
    "identity": {},
    "participant_id": "0208:0477472701",
    "status": "none",
    "account": {
        "id": "string",
        "name": "Le Comptoir Montois SRL",
        "archived": true
    },
    "transport": {},
    "smp": {
        "published": true,
        "checked_at": "2026-03-15T09:41:00+00:00"
    },
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "supported_documents": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "can_register": true,
    "blockers": [
        "string"
    ],
    "blocker_codes": [
        "string"
    ],
    "managed_by_novadesko": true,
    "registered_elsewhere": true,
    "external_provider": "string",
    "provider_configured": true,
    "environment": "production",
    "contact": {},
    "last_error": "string"
}
schémaPeppolThirdPartyStatus
  • identifierstring | null
    ex. 0208:0402531376
  • registeredboolean | null
  • access_pointPeppolAccessPoint | null
  • document_typesPeppolDocumentType[]
  • checked_atstring <date-time> | null
  • staleboolean
  • errorstring | null
  • sourcestring | null
    ex. sml+smp
Exemple
{
    "identifier": "0208:0402531376",
    "registered": true,
    "access_point": {
        "smp_host": "smp.b2brouter.net",
        "provider_name": "B2Brouter",
        "endpoint_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "technical_contact": "string"
    },
    "document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "checked_at": "2026-03-15T09:41:00+00:00",
    "stale": true,
    "error": "string",
    "source": "sml+smp"
}
schémaPeriod
  • idinteger
    ex. 16
  • fiscal_year_idinteger
    ex. 2
  • numberinteger
    0 = opening, 1-12 = months, 99 = closing.
    ex. 3
  • labelstring
    ex. Mars 2026
  • starts_onstring <date-time>
  • ends_onstring <date-time>
  • is_lockedboolean
    ex. false
  • locked_atstring <date-time> | null
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
Exemple
{
    "id": 16,
    "fiscal_year_id": 2,
    "number": 3,
    "label": "Mars 2026",
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "is_locked": false,
    "locked_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3
}
schémaPeriodLockedError422 of a write whose period is locked or whose fiscal year is closed.

422 of a write whose period is locked or whose fiscal year is closed.

  • messagestringrequis
    ex. La période Mars 2026 est verrouillée.
  • codestringrequis
    period_locked
  • reasonstringrequis
    period_locked fiscal_year_closed
  • errorsobjectrequis
Exemple
{
    "message": "La période Mars 2026 est verrouillée.",
    "code": "period_locked",
    "reason": "period_locked",
    "errors": {
        "entry_date": [
            "La période Mars 2026 est verrouillée."
        ]
    }
}
schémaPricingGrid
  • currencystring
    ex. EUR
  • vat_includedboolean
    ex. false
  • plansobject[]
    Propriétés
    • codestring
      starter firm
    • namestring
      ex. Firm
    • kindstring
      starter firm
    • base_price_monthlynumber
      ex. 49
    • per_companynumber
      ex. 2.9
    • tiersobject[]
      Propriétés
      • up_tointeger | null
        ex. 100
      • pricenumber
        ex. 2.9
    • max_companiesinteger | null
    • peppol_fair_use_per_companyinteger
      ex. 100
    • annual_discount_pctnumber
      ex. 10
    • includedstring[]
  • optionsobject[]
    Propriétés
    • codestring
      ex. client_portal
    • namestring
      ex. Client portal
    • price_monthlynumber
      ex. 6.9
    • unitstring
      ex. client
  • annual_discount_pctnumber
    ex. 10
  • winauditorobject
    Reference prices used for the comparison.
  • pilotobject
    Propriétés
    • free_monthsinteger
      ex. 3
    • max_firmsinteger
      ex. 20
Exemple
{
    "currency": "EUR",
    "vat_included": false,
    "plans": [
        {
            "code": "starter",
            "name": "Firm",
            "kind": "starter",
            "base_price_monthly": 49,
            "per_company": 2.9,
            "tiers": [
                {
                    "up_to": 100,
                    "price": 2.9
                }
            ],
            "max_companies": 1,
            "peppol_fair_use_per_company": 100,
            "annual_discount_pct": 10,
            "included": [
                "Unlimited users"
            ]
        }
    ],
    "options": [
        {
            "code": "client_portal",
            "name": "Client portal",
            "price_monthly": 6.9,
            "unit": "client"
        }
    ],
    "annual_discount_pct": 10,
    "winauditor": {},
    "pilot": {
        "free_months": 3,
        "max_firms": 20
    }
}
schémaPricingSimulation
  • companiesinteger
    ex. 25
  • yearlyboolean
    ex. false
  • starterobject | null
    Null when the plan cannot hold that many companies.
  • firmobject
    Propriétés
    • planstring
      ex. firm
    • billing_intervalstring
      monthly yearly
    • companiesinteger
      ex. 25
    • basenumber
      ex. 49
    • companies_breakdownobject[]
      Propriétés
      • frominteger
        ex. 1
      • tointeger
        ex. 100
      • quantityinteger
        ex. 25
      • unit_pricenumber
        ex. 2.9
      • totalnumber
        ex. 72.5
    • companies_totalnumber
      ex. 72.5
    • optionsobject[]
    • options_totalnumber
      ex. 0
    • pilot_discountnumber
      ex. 0
    • annual_discount_pctnumber
      ex. 0
    • annual_discountnumber
      ex. 0
    • discountnumber
      ex. 0
    • totalnumber
      ex. 121.5
    • yearly_totalnumber
      ex. 1458
    • namestring
      ex. Firm
    • saving_vs_winauditornumber
      ex. 36
    • saving_pctnumber
      ex. 22.9
  • winauditornumber
    ex. 157.5
  • cheapeststring
    starter firm
Exemple
{
    "companies": 25,
    "yearly": false,
    "starter": {},
    "firm": {
        "plan": "firm",
        "billing_interval": "monthly",
        "companies": 25,
        "base": 49,
        "companies_breakdown": [
            {
                "from": 1,
                "to": 100,
                "quantity": 25,
                "unit_price": 2.9,
                "total": 72.5
            }
        ],
        "companies_total": 72.5,
        "options": [
            {}
        ],
        "options_total": 0,
        "pilot_discount": 0,
        "annual_discount_pct": 0,
        "annual_discount": 0,
        "discount": 0,
        "total": 121.5,
        "yearly_total": 1458,
        "name": "Firm",
        "saving_vs_winauditor": 36,
        "saving_pct": 22.9
    },
    "winauditor": 157.5,
    "cheapest": "starter"
}
schémaRecurringEntry
  • idinteger
    ex. 5
  • company_idinteger
  • journal_idinteger
    ex. 5
  • labelstring
    ex. Loyer mensuel
  • referencestring | null
  • third_party_idinteger | null
  • frequencystring
    monthly quarterly yearly
  • next_datestring <date-time>
    ex. 2026-04-01T00:00:00.000000Z
  • end_datestring <date-time> | null
  • linesobject[]
    Propriétés
    • account_idinteger
      ex. 368
    • debitstring | null
      ex. 1500.00
    • creditstring | null
    • labelstring | null
    • third_party_idinteger | null
  • is_activeboolean
  • last_generated_onstring <date> | null
  • generated_countinteger
    ex. 3
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • journalobject
    Propriétés
    • idinteger
    • codestring
      ex. OD
    • labelstring
      ex. Opérations diverses
  • third_partyobject | null
Exemple
{
    "id": 5,
    "company_id": 7,
    "journal_id": 5,
    "label": "Loyer mensuel",
    "reference": "F-2026-0412",
    "third_party_id": 18,
    "frequency": "monthly",
    "next_date": "2026-04-01T00:00:00.000000Z",
    "end_date": "2026-03-15T09:41:00+00:00",
    "lines": [
        {
            "account_id": 368,
            "debit": "1500.00",
            "credit": "0.00",
            "label": "Facture Brasserie Dubuisson",
            "third_party_id": 18
        }
    ],
    "is_active": true,
    "last_generated_on": "2026-03-15",
    "generated_count": 3,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "journal": {
        "id": 42,
        "code": "OD",
        "label": "Opérations diverses"
    },
    "third_party": {}
}
schémaRevisionOne line of the version history.

One line of the version history.

  • idinteger
    ex. 2301
  • actionstring
    created updated deleted restored reverted synced
  • effectstring
    ex. updated
  • action_labelstring
    ex. Modification · Tiers
  • subject_typestring
    ex. third_parties
  • subject_type_labelstring
    ex. Tiers
  • subject_idinteger
    ex. 18
  • subject_labelstring
    ex. DUBUISSON · Brasserie Dubuisson SA
  • userobject | null
  • actor_namestring | null
    ex. Claire Dumont
  • changesobject[]
    Propriétés
    • fieldstring
      ex. payment_terms_days
    • labelstring
      ex. Délai de paiement
    • oldany
    • newany
  • versioninteger
    ex. 4
  • operation_idstring <uuid>
  • client_mutation_idstring | null
  • originstring
    online offline_sync system bridge
  • device_idstring | null
  • device_namestring | null
  • reasonstring | null
  • reverts_revision_idinteger | null
  • reverted_atstring <date-time> | null
  • reverted_by_revision_idinteger | null
  • occurred_atstring <date-time>
  • created_atstring <date-time>
  • can_revertboolean
  • revert_blocked_reasonstring | null
  • revert_blocked_messagestring | null
  • revert_effectstring | null
    update, trash, restore, recreate or reverse.
  • snapshot_beforeobject | null
    Single revision only.
  • snapshot_afterobject | null
    Single revision only.
  • ipstring | null
    Single revision only.
Exemple
{
    "id": 2301,
    "action": "created",
    "effect": "updated",
    "action_label": "Modification · Tiers",
    "subject_type": "third_parties",
    "subject_type_label": "Tiers",
    "subject_id": 18,
    "subject_label": "DUBUISSON · Brasserie Dubuisson SA",
    "user": {
        "id": 12,
        "name": "Claire Dumont"
    },
    "actor_name": "Claire Dumont",
    "changes": [
        {
            "field": "payment_terms_days",
            "label": "Délai de paiement",
            "old": null,
            "new": null
        }
    ],
    "version": 4,
    "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    "origin": "online",
    "device_id": "mac-7F3A21",
    "device_name": "MacBook de Claire",
    "reason": "string",
    "reverts_revision_id": 42,
    "reverted_at": "2026-03-15T09:41:00+00:00",
    "reverted_by_revision_id": 42,
    "occurred_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "can_revert": true,
    "revert_blocked_reason": "string",
    "revert_blocked_message": "string",
    "revert_effect": "string",
    "snapshot_before": {},
    "snapshot_after": {},
    "ip": "string"
}
schémaSheetView
  • sheetCompanySheet | null
  • sheet_atstring <date-time> | null
  • addressobject
    Propriétés
    • streetstring | null
      Street
      ex. Grand-Place
    • house_numberstring | null
      Number
      ex. 14
    • boxstring | null
      Box
    • postal_codestring | null
      Postal code
      ex. 7000
    • citystring | null
      City
      ex. Mons
    • countrystring | null
      ISO 3166-1 alpha-2
      ex. BE
  • address_linestring | null
  • legal_formobject | null
  • nace_codesobject[]
    Propriétés
    • codestring
    • classificationstring
    • labelstring | null
    • is_mainboolean
  • main_nace_codestring | null
  • vat_number_formattedstring | null
    ex. BE 0477.472.701
  • mapobject
    Propriétés
    • querystring
      Address used for the map
      ex. Grand-Place 14, 7000 Mons, Belgique
    • apple_urlstring <uri>
    • google_urlstring <uri>
    • static_urlstring <uri> | null
    • latitudenumber | null
    • longitudenumber | null
Exemple
{
    "sheet": {
        "identifier": "0477472701",
        "enterprise_number": "0477472701",
        "vat_number": "BE0477472701",
        "name": "Le Comptoir Montois",
        "legal_form": "SRL",
        "legal_form_code": "610",
        "status": "active",
        "start_date": "2026-03-15",
        "address": {
            "street": "Grand-Place",
            "house_number": "14",
            "box": "string",
            "postal_code": "7000",
            "city": "Mons",
            "country": "BE"
        },
        "address_line": "string",
        "latitude": 12.5,
        "longitude": 12.5,
        "nace_codes": [
            {
                "code": "56111",
                "classification": "MAIN",
                "label": "Facture Brasserie Dubuisson"
            }
        ],
        "main_nace_code": "string",
        "email": "claire.dumont@fiduciaire-dumont.be",
        "phone": "+32 65 31 42 18",
        "website": "https://www.comptoir-montois.be",
        "source": "companysearch",
        "fetched_at": "2026-03-15T09:41:00+00:00",
        "map": {
            "query": "Grand-Place 14, 7000 Mons, Belgique",
            "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
            "latitude": 12.5,
            "longitude": 12.5
        }
    },
    "sheet_at": "2026-03-15T09:41:00+00:00",
    "address": {
        "street": "Grand-Place",
        "house_number": "14",
        "box": "string",
        "postal_code": "7000",
        "city": "Mons",
        "country": "BE"
    },
    "address_line": "string",
    "legal_form": {},
    "nace_codes": [
        {
            "code": "COMPTOIR",
            "classification": "string",
            "label": "Facture Brasserie Dubuisson",
            "is_main": true
        }
    ],
    "main_nace_code": "string",
    "vat_number_formatted": "BE 0477.472.701",
    "map": {
        "query": "Grand-Place 14, 7000 Mons, Belgique",
        "apple_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "google_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "static_url": "https://api.novafisko.com/v1/companies/XBVD5O1L29HC",
        "latitude": 12.5,
        "longitude": 12.5
    }
}
schémaSyncChange
  • resourcestring
    ex. third_parties
  • opstring
    upsert delete
  • idinteger
    ex. 18
  • versioninteger | null
    ex. 4
  • dataobject | null
    Resource serialised as by its list endpoint; null for a tombstone.
  • changed_atstring <date-time>
  • seqinteger
    Position in the change feed.
    ex. 1042
Exemple
{
    "resource": "third_parties",
    "op": "upsert",
    "id": 18,
    "version": 4,
    "data": {},
    "changed_at": "2026-03-15T09:41:00+00:00",
    "seq": 1042
}
schémaSyncConflict
  • idinteger
    ex. 8
  • statusstring
    open resolved
  • typestring
    field delete_vs_update update_vs_delete duplicate locked
  • type_labelstring
  • resourcestring
    ex. third_parties
  • record_idinteger | null
  • subject_idinteger | null
  • subject_labelstring | null
  • client_mutation_idstring | null
  • fieldsobject[]
    Propriétés
    • fieldstring
    • labelstring
    • serverany
    • clientany
    • winnerstring
    • rulestring
  • client_dataobject | null
  • server_dataobject | null
  • server_versioninteger | null
  • winnerstring | null
  • loserstring | null
  • resolutionstring | null
  • resolved_byinteger | null
  • client_userobject | null
  • server_userobject | null
  • resolved_by_userobject | null
  • device_idstring | null
  • created_atstring <date-time>
  • resolved_atstring <date-time> | null
  • choicesstring[]
    server client merge
Exemple
{
    "id": 8,
    "status": "open",
    "type": "field",
    "type_label": "string",
    "resource": "third_parties",
    "record_id": 42,
    "subject_id": 42,
    "subject_label": "string",
    "client_mutation_id": "b0a6f6f0-7d1c-4c5e-8a55-3f2b1c9d0e11",
    "fields": [
        {
            "field": "string",
            "label": "Facture Brasserie Dubuisson",
            "server": null,
            "client": null,
            "winner": "string",
            "rule": "string"
        }
    ],
    "client_data": {},
    "server_data": {},
    "server_version": 1,
    "winner": "string",
    "loser": "string",
    "resolution": "string",
    "resolved_by": 1,
    "client_user": {},
    "server_user": {},
    "resolved_by_user": {},
    "device_id": "mac-7F3A21",
    "created_at": "2026-03-15T09:41:00+00:00",
    "resolved_at": "2026-03-15T09:41:00+00:00",
    "choices": [
        "server"
    ]
}
schémaSyncMutationOne action made offline, replayed through the matching REST action (same validation, same body).

One action made offline, replayed through the matching REST action (same validation, same body).

  • client_mutation_idstring <uuid>requis
    Idempotence key.
  • occurred_atstring <date-time>
    Date of the action on the device.
  • operation_idstring <uuid>
  • resourcestringrequis
    third_parties, accounts, journals, journal_rules, bank_rules, recurring_entries, analytic_codes, fixed_assets, entries, documents, document_lines, bank_transactions, company_settings.
    ex. third_parties
  • opstringrequis
    create update delete action
  • actionstring
    ignore restore entry invoice reverse book update_line
  • idinteger | string | null
    Server id, or the tmp-… id of a record created earlier in the queue.
  • client_temp_idstring
    Temporary id of a creation (tmp-<uuid>), mapped to the server id.
    ex. tmp-3c1f
  • parent_idinteger | string | null
  • base_versioninteger
    Version the client edited.
  • dataobject
    Body of the equivalent REST request.
Exemple
{
    "client_mutation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "occurred_at": "2026-03-15T09:41:00+00:00",
    "operation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "resource": "third_parties",
    "op": "create",
    "action": "ignore",
    "id": 42,
    "client_temp_id": "tmp-3c1f",
    "parent_id": 42,
    "base_version": 1,
    "data": {}
}
schémaSyncMutationResult
  • client_mutation_idstring <uuid>
  • statusstring
    applied duplicate conflict rejected
  • original_statusstring | null
  • codestring | null
    locked, not_supported_offline, validation, not_found, forbidden, invalid_mutation, unknown_temp_id, unprocessable, server_error.
  • messagestring | null
  • resourcestring
  • opstring
  • actionstring | null
  • idinteger | null
  • client_temp_idstring | null
  • versioninteger | null
  • dataobject | null
  • errorsobject | null
  • conflictobject | null
    Propriétés
    • server_versioninteger
    • server_dataobject
    • fieldsobject[]
      Propriétés
      • fieldstring
      • clientany
      • serverany
      • winnerstring
        client server
      • rulestring
    • resolutionstring
  • duplicate_ofinteger | null
  • retryableboolean
Exemple
{
    "client_mutation_id": "bf413a19-2136-4504-bc42-b314637eb5c7",
    "status": "applied",
    "original_status": "string",
    "code": "COMPTOIR",
    "message": "OK",
    "resource": "string",
    "op": "string",
    "action": "string",
    "id": 42,
    "client_temp_id": "string",
    "version": 3,
    "data": {},
    "errors": {},
    "conflict": {
        "server_version": 1,
        "server_data": {},
        "fields": [
            {
                "field": "string",
                "client": null,
                "server": null,
                "winner": "client",
                "rule": "string"
            }
        ],
        "resolution": "string"
    },
    "duplicate_of": 1,
    "retryable": true
}
schémaThirdPartyCustomer or supplier of a company file.

Customer or supplier of a company file.

  • idinteger
    ex. 18
  • company_idinteger
    ex. 7
  • typestring
    customer supplier
  • codestring
    ex. DUBUISSON
  • namestring
    ex. Brasserie Dubuisson SA
  • contact_namestring | null
  • vat_numberstring | null
    ex. BE0402531376
  • enterprise_numberstring | null
    ex. 0402531376
  • legal_form_codestring | null
  • vat_statusstring
    subject not_subject exempt intra_eu non_eu
  • countrystring
    ex. BE
  • languagestring | null
    ex. fr
  • categorystring | null
  • currencystring
    ex. EUR
  • addressstring | null
    ex. Chaussée de Mons 28
  • house_numberstring | null
  • boxstring | null
  • address_line_2string | null
  • postal_codestring | null
    ex. 7904
  • citystring | null
    ex. Pipaix
  • nace_codestring | null
  • ibanstring | null
    ex. BE71096123456769
  • bicstring | null
    ex. GKCCBEBB
  • bank_accountstring | null
  • emailstring <email> | null
    ex. compta@dubuisson.example
  • phonestring | null
  • faxstring | null
  • websitestring | null
  • payment_terms_daysinteger
    ex. 30
  • form_281_50_typestring | null
  • profession_281_50string | null
  • is_natural_personboolean
    ex. false
  • notesstring | null
  • default_vat_code_idinteger | null
  • default_account_idinteger | null
  • vies_validboolean | null
  • vies_checked_atstring <date-time> | null
  • vies_namestring | null
  • peppol_identifierstring | null
    ex. 0208:0402531376
  • peppol_registeredboolean | null
  • peppol_access_pointobject | null
  • peppol_document_typesPeppolDocumentType[] | null
  • peppol_checked_atstring <date-time> | null
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • deleted_atstring <date-time> | null
    Set while the record is in the recycle bin.
  • deleted_byinteger | null
  • default_accountobject | null
    Loaded on the single sheet.
  • default_vat_codeobject | null
    Loaded on the single sheet.
Exemple
{
    "id": 18,
    "company_id": 7,
    "type": "customer",
    "code": "DUBUISSON",
    "name": "Brasserie Dubuisson SA",
    "contact_name": "string",
    "vat_number": "BE0402531376",
    "enterprise_number": "0402531376",
    "legal_form_code": "string",
    "vat_status": "subject",
    "country": "BE",
    "language": "fr",
    "category": "string",
    "currency": "EUR",
    "address": "Chaussée de Mons 28",
    "house_number": "14",
    "box": "string",
    "address_line_2": "string",
    "postal_code": "7904",
    "city": "Pipaix",
    "nace_code": "string",
    "iban": "BE71096123456769",
    "bic": "GKCCBEBB",
    "bank_account": "string",
    "email": "compta@dubuisson.example",
    "phone": "+32 65 31 42 18",
    "fax": "string",
    "website": "https://www.comptoir-montois.be",
    "payment_terms_days": 30,
    "form_281_50_type": "string",
    "profession_281_50": "string",
    "is_natural_person": false,
    "notes": "string",
    "default_vat_code_id": 42,
    "default_account_id": 42,
    "vies_valid": true,
    "vies_checked_at": "2026-03-15T09:41:00+00:00",
    "vies_name": "string",
    "peppol_identifier": "0208:0402531376",
    "peppol_registered": true,
    "peppol_access_point": {},
    "peppol_document_types": [
        {
            "id": "bis_billing_invoice",
            "name": "Invoice BIS Billing 3.0",
            "family": "billing",
            "description": "Facture électronique européenne (EN 16931), format Peppol BIS Billing 3.0.",
            "document_id": "string"
        }
    ],
    "peppol_checked_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": 1,
    "default_account": {},
    "default_vat_code": {}
}
schémaTrashItem
  • typestring
    ex. third_parties
  • idinteger
    ex. 18
  • labelstring
    ex. DUBUISSON · Brasserie Dubuisson SA
  • deleted_atstring <date-time>
  • deleted_byobject | null
  • purge_atstring <date-time>
    Date of the definitive purge.
  • restorableboolean
  • blocked_reasonstring | null
  • blocked_messagestring | null
  • versioninteger
Exemple
{
    "type": "third_parties",
    "id": 18,
    "label": "DUBUISSON · Brasserie Dubuisson SA",
    "deleted_at": "2026-03-15T09:41:00+00:00",
    "deleted_by": {
        "id": 12,
        "name": "Claire Dumont"
    },
    "purge_at": "2026-03-15T09:41:00+00:00",
    "restorable": true,
    "blocked_reason": "string",
    "blocked_message": "string",
    "version": 3
}
schémaTreasury
  • accountsobject[]
    Propriétés
    • journal_idinteger
      ex. 7
    • codestring
      ex. BNP
    • labelstring
      ex. BNP Paribas Fortis
    • ibanstring | null
    • accountstring
      ex. 550000
    • accounting_balancestring <decimal>
      ex. 19630.11
    • last_statement_balancestring <decimal> | null
      ex. 19630.11
    • last_statement_datestring <date> | null
    • pending_countinteger
      ex. 3
    • pending_amountstring <decimal>
      ex. 1842.50
    • differencestring <decimal> | null
      ex. 0.00
  • total_accounting_balancestring <decimal>
    ex. 21480.61
Exemple
{
    "accounts": [
        {
            "journal_id": 7,
            "code": "BNP",
            "label": "BNP Paribas Fortis",
            "iban": "BE68539007547034",
            "account": "550000",
            "accounting_balance": "19630.11",
            "last_statement_balance": "19630.11",
            "last_statement_date": "2026-03-15",
            "pending_count": 3,
            "pending_amount": "1842.50",
            "difference": "0.00"
        }
    ],
    "total_accounting_balance": "21480.61"
}
schémaUserAuthenticated user with the firms it belongs to.

Authenticated user with the firms it belongs to.

  • idinteger
    ex. 12
  • namestring
    ex. Claire Dumont
  • emailstring <email>
  • localestring
    fr nl en de
  • email_verifiedboolean
  • pending_emailstring <email> | null
    New address waiting for confirmation.
  • is_platform_adminboolean
    ex. false
  • is_demoboolean
    True for the ephemeral user of the demo firm.
    ex. false
  • firmsobject[]
    Propriétés
    • public_tokenstring
      ex. NDTQVQU4AUAV
    • namestring
      ex. Fiduciaire Dumont & Associés
    • rolestring
      admin manager encoder reviewer
  • managed_firmsobject[]
    Propriétés
    • public_tokenstring
      ex. NDTQVQU4AUAV
    • namestring
      ex. Fiduciaire Dumont & Associés
Exemple
{
    "id": 12,
    "name": "Claire Dumont",
    "email": "claire.dumont@fiduciaire-dumont.be",
    "locale": "fr",
    "email_verified": true,
    "pending_email": "claire.dumont@fiduciaire-dumont.be",
    "is_platform_admin": false,
    "is_demo": false,
    "firms": [
        {
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés",
            "role": "admin"
        }
    ],
    "managed_firms": [
        {
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        }
    ]
}
schémaVatCode
  • idinteger
    ex. 4
  • company_idinteger
  • codestring
    ex. V21
  • labelstring
    ex. Ventes 21 %
  • directionstring
    sale purchase
  • ratestring <decimal>
    ex. 21.00
  • naturestring
    standard intra_eu cocontractor export exempt import out_of_scope
  • deductible_pctstring <decimal>
    ex. 100.00
  • base_gridstring | null
    Grid of the taxable base.
    ex. 03
  • vat_gridstring | null
    Grid of the VAT.
    ex. 54
  • due_vat_gridstring | null
    Grid of the VAT due (reverse charge).
  • credit_base_gridstring | null
    Grid of the base on a credit note.
    ex. 49
  • credit_vat_gridstring | null
    ex. 64
  • vat_accountstring | null
    ex. 451100
  • due_vat_accountstring | null
  • descriptionstring | null
  • is_activeboolean
  • sort_orderinteger
    ex. 13
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
Exemple
{
    "id": 4,
    "company_id": 7,
    "code": "V21",
    "label": "Ventes 21 %",
    "direction": "sale",
    "rate": "21.00",
    "nature": "standard",
    "deductible_pct": "100.00",
    "base_grid": "03",
    "vat_grid": "54",
    "due_vat_grid": "string",
    "credit_base_grid": "49",
    "credit_vat_grid": "64",
    "vat_account": "451100",
    "due_vat_account": "string",
    "description": "Description",
    "is_active": true,
    "sort_order": 13,
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3
}
schémaVatComputation
  • gridsobject
    Belgian VAT grids: grid number => amount (decimal string).
  • amount_duestring <decimal>
    Grid 71.
    ex. 157.50
  • amount_refundstring <decimal>
    Grid 72.
    ex. 0.00
  • warningsstring[]
  • entriesinteger
    Entries carrying VAT in the period.
    ex. 38
Exemple
{
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "warnings": [
        "string"
    ],
    "entries": 38
}
schémaVatDeclaration
  • idinteger
    ex. 14
  • company_idinteger
  • period_typestring
    monthly quarterly
  • yearinteger
    ex. 2026
  • periodinteger
    Month (1-12) or quarter (1-4).
    ex. 1
  • starts_onstring <date-time>
  • ends_onstring <date-time>
  • gridsobject
    Belgian VAT grids: grid number => amount (decimal string).
  • amount_duestring <decimal>
    ex. 157.50
  • amount_refundstring <decimal>
    ex. 0.00
  • statusstring
    draft validated submitted
  • validated_atstring <date-time> | null
  • validated_byinteger | null
  • submitted_atstring <date-time> | null
  • submission_referencestring | null
    Intervat receipt reference.
  • journal_entry_idinteger | null
    VAT settlement entry.
  • warningsstring[]
  • created_atstring <date-time>
  • updated_atstring <date-time>
  • lock_versioninteger
    Internal lock counter.
    ex. 3
  • versioninteger
    Version of the record, to send back as X-Base-Version / base_version.
    ex. 3
  • journal_entryobject | null
Exemple
{
    "id": 14,
    "company_id": 7,
    "period_type": "monthly",
    "year": 2026,
    "period": 1,
    "starts_on": "2026-03-15T09:41:00+00:00",
    "ends_on": "2026-03-15T09:41:00+00:00",
    "grids": {
        "00": "0.00",
        "01": "0.00",
        "02": "0.00",
        "03": "1000.00",
        "54": "210.00",
        "59": "52.50",
        "71": "157.50",
        "72": "0.00",
        "81": "0.00",
        "82": "250.00",
        "83": "0.00"
    },
    "amount_due": "157.50",
    "amount_refund": "0.00",
    "status": "draft",
    "validated_at": "2026-03-15T09:41:00+00:00",
    "validated_by": 1,
    "submitted_at": "2026-03-15T09:41:00+00:00",
    "submission_reference": "string",
    "journal_entry_id": 1284,
    "warnings": [
        "string"
    ],
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00",
    "lock_version": 3,
    "version": 3,
    "journal_entry": {}
}
schémaVersionConflict409 of the optimistic lock (`X-Base-Version`).

409 of the optimistic lock (X-Base-Version).

  • messagestringrequis
  • codestringrequis
    conflict
  • server_versionintegerrequis
    Current version on the server.
    ex. 4
  • server_dataobjectrequis
    Current state of the record.
Exemple
{
    "message": "OK",
    "code": "conflict",
    "server_version": 4,
    "server_data": {}
}
schémaWebhookDelivery
  • idinteger
    ex. 1871
  • event_idstring
    ex. evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE
  • eventstring
    ex. entry.posted
  • statusstring
    pending delivered failed
  • attemptsinteger
    8 attempts at most.
    ex. 1
  • next_attempt_atstring <date-time> | null
  • response_statusinteger | null
    ex. 200
  • response_excerptstring | null
  • duration_msinteger | null
    ex. 184
  • delivered_atstring <date-time> | null
  • created_atstring <date-time>
  • attemptinteger
    Alias of attempts.
    ex. 1
  • http_statusinteger | null
    Alias of response_status.
    ex. 200
Exemple
{
    "id": 1871,
    "event_id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "entry.posted",
    "status": "pending",
    "attempts": 1,
    "next_attempt_at": "2026-03-15T09:41:00+00:00",
    "response_status": 200,
    "response_excerpt": "string",
    "duration_ms": 184,
    "delivered_at": "2026-03-15T09:41:00+00:00",
    "created_at": "2026-03-15T09:41:00+00:00",
    "payload": {
        "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
        "event": "entry.posted",
        "api_version": "v1",
        "created_at": "2026-03-15T09:41:00+00:00",
        "firm": {
            "public_token": "NDTQVQU4AUAV",
            "name": "Fiduciaire Dumont & Associés"
        },
        "company": {
            "public_token": "XBVD5O1L29HC",
            "name": "Le Comptoir Montois SRL"
        },
        "data": {}
    },
    "attempt": 1,
    "http_status": 200
}
schémaWebhookEndpoint
  • idinteger
    ex. 3
  • urlstring <uri>
    ex. https://erp.example.com/hooks/novafisko
  • descriptionstring | null
    ex. ERP connector
  • eventsstring[]
  • is_activeboolean
  • secret_hintstring
    Masked signing secret.
    ex. whsec_…ab12
  • last_delivery_atstring <date-time> | null
  • last_statusstring | null
    Status of the last delivery.
    ex. delivered
  • created_atstring <date-time>
  • updated_atstring <date-time>
Exemple
{
    "id": 3,
    "url": "https://erp.example.com/hooks/novafisko",
    "description": "ERP connector",
    "events": [
        "entry.posted"
    ],
    "is_active": true,
    "secret_hint": "whsec_…ab12",
    "last_delivery_at": "2026-03-15T09:41:00+00:00",
    "last_status": "delivered",
    "created_at": "2026-03-15T09:41:00+00:00",
    "updated_at": "2026-03-15T09:41:00+00:00"
}
schémaWebhookEventBody POSTed to a webhook endpoint. Verify `X-Novafisko-Signature` before trusting it.

Body POSTed to a webhook endpoint. Verify X-Novafisko-Signature before trusting it.

  • idstringrequis
    Unique event id; use it to deduplicate.
    ex. evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE
  • eventstringrequis
    ex. entry.posted
  • api_versionstringrequis
    ex. v1
  • created_atstring <date-time>requis
    UTC.
  • firmobjectrequis
    Propriétés
    • public_tokenstring
      ex. NDTQVQU4AUAV
    • namestring
      ex. Fiduciaire Dumont & Associés
  • companyobject | null
    Propriétés
    • public_tokenstring
      ex. XBVD5O1L29HC
    • namestring
      ex. Le Comptoir Montois SRL
  • dataobjectrequis
    Event-specific payload (ids, references, amounts).
Exemple
{
    "id": "evt_01JD8X5Q2M7Z4W9K3T6B0N1VCE",
    "event": "entry.posted",
    "api_version": "v1",
    "created_at": "2026-03-15T09:41:00+00:00",
    "firm": {
        "public_token": "NDTQVQU4AUAV",
        "name": "Fiduciaire Dumont & Associés"
    },
    "company": {
        "public_token": "XBVD5O1L29HC",
        "name": "Le Comptoir Montois SRL"
    },
    "data": {}
}