Authentification
Obtenir un jeton de session avec auth/login, créer des jetons d'intégration à capacités limitées et les utiliser en toute sécurité.
Toutes les routes de l'API, hormis quelques routes publiques (status, ping, pricing, auth/login, auth/demo), exigent un jeton porteur dans l'en-tête Authorization.
GET /v1/auth/me HTTP/1.1
Host: api.novafisko.com
Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs
Accept: application/json
NovaFisko distingue deux sortes de jetons.
| Type | Obtenu par | Portée | Usage |
|---|---|---|---|
| Jeton de session | POST /v1/auth/login |
Tous les droits de l'utilisateur | Applications NovaFisko, scripts personnels |
| Jeton d'intégration | POST /v1/auth/tokens |
Capacités choisies : read, write, sync |
Connexion d'une autre solution, serveur à serveur |
Dans les deux cas, le jeton agit au nom d'un utilisateur : il voit les cabinets et les dossiers auxquels cet utilisateur a accès, ni plus ni moins. Un dossier inaccessible répond 404, jamais 403, pour ne pas révéler son existence.
Jeton de session
Se connecter
curl -X POST https://api.novafisko.com/v1/auth/login \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": "claire.dumont@fiduciaire-exemple.be",
"password": "votre-mot-de-passe",
"device_name": "script-export-mensuel"
}'
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
email |
chaîne | oui | Adresse de l'utilisateur |
password |
chaîne | oui | Mot de passe |
device_name |
chaîne, 100 caractères max | non | Nom donné au jeton, api par défaut |
Réponse 201 :
{
"token": "57|n8Yw2c0vXk4JrPq1LmZs",
"user": {
"id": 12,
"name": "Claire Dumont",
"email": "claire.dumont@fiduciaire-exemple.be",
"locale": "fr",
"is_platform_admin": false,
"firms": [
{"public_token": "Fd7hQ2mN8sXa", "name": "Fiduciaire Exemple", "role": "admin"}
],
"managed_firms": [
{"public_token": "Fd7hQ2mN8sXa", "name": "Fiduciaire Exemple"}
]
}
}
Des identifiants incorrects renvoient 422 avec une erreur sur le champ email. La route est limitée à 20 requêtes par minute et par adresse IP. Après 10 échecs, toute tentative est refusée pendant 5 minutes.
Les utilisateurs d'une fiduciaire Novadesko se connectent avec leurs identifiants Novadesko. NovaFisko les vérifie en lecture seule, puis reflète le cabinet, ses membres et ses dossiers à chaque connexion.
Connaître l'utilisateur courant
GET /v1/auth/me renvoie le même objet user que la connexion, complété par is_demo (true pour un utilisateur du cabinet de démonstration). C'est l'appel idéal pour vérifier qu'un jeton est encore valide.
Se déconnecter
POST /v1/auth/logout révoque le jeton utilisé pour l'appel et répond 204 sans corps.
Jetons d'intégration
Un jeton d'intégration est conçu pour être confié à une autre solution. Il porte un nom, une liste de capacités, une date d'expiration facultative et la date de sa dernière utilisation.
Capacités
| Capacité | Autorise |
|---|---|
read |
Toutes les requêtes GET et HEAD |
write |
Les requêtes POST, PUT, PATCH et DELETE |
sync |
Les routes companies/{company}/sync/* (bootstrap, pull, push, status, conflicts), quelle que soit la méthode |
Les six routes de synchronisation hors ligne n'exigent que sync. Un connecteur qui se contente de suivre les changements avec sync/pull n'a donc besoin ni de read ni de write. La route POST companies/{company}/sync/novadesko, qui relance l'import depuis Novadesko, n'en fait pas partie : elle relève de write.
Créer un jeton
La création exige un jeton de session : un jeton d'intégration ne peut pas en créer d'autres.
curl -X POST https://api.novafisko.com/v1/auth/tokens \
-H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs" \
-H "Content-Type: application/json" \
-d '{
"name": "Connecteur ERP Atelier",
"abilities": ["read", "write"],
"expires_in_days": 365
}'
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
name |
chaîne, 100 caractères max | oui | Nom lisible, affiché dans la liste |
abilities |
tableau | oui, 1 valeur minimum | Parmi read, write, sync |
expires_in_days |
entier de 1 à 730, ou null |
non | Durée de vie ; null ou absent : pas d'expiration |
Réponse 201 :
{
"token": "83|4Hq7ZtVb2Mx9KcLp0RsWyE1uNaJd6FgT",
"integration_token": {
"id": 83,
"name": "Connecteur ERP Atelier",
"abilities": ["read", "write"],
"created_at": "2026-10-05T08:30:11+00:00",
"expires_at": "2027-10-05T08:30:11+00:00",
"last_used_at": null
}
}
Un utilisateur peut détenir 50 jetons d'intégration au maximum. Au-delà, la création répond 422 avec le code token_limit_reached. La route est limitée à 20 créations par minute.
La valeur token n'est affichée qu'une seule fois, dans cette réponse. NovaFisko n'en conserve qu'une empreinte. Si vous la perdez, supprimez le jeton et créez-en un autre.
Lister les jetons
curl https://api.novafisko.com/v1/auth/tokens \
-H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs"
{
"data": [
{
"id": 83,
"name": "Connecteur ERP Atelier",
"abilities": ["read", "write"],
"created_at": "2026-10-05T08:30:11+00:00",
"expires_at": "2027-10-05T08:30:11+00:00",
"last_used_at": "2026-10-05T09:02:47+00:00"
}
]
}
Seuls vos propres jetons d'intégration sont listés. Les jetons de session des applications n'y figurent pas.
Révoquer un jeton
curl -X DELETE https://api.novafisko.com/v1/auth/tokens/83 \
-H "Authorization: Bearer 57|n8Yw2c0vXk4JrPq1LmZs"
La réponse est 204. Le jeton cesse de fonctionner immédiatement. Un identifiant inconnu, ou qui n'est pas un de vos jetons d'intégration, répond 404.
Erreurs d'authentification
| Statut | code |
Cause | Que faire |
|---|---|---|---|
401 |
absent | Jeton manquant, révoqué ou expiré | Obtenir un nouveau jeton |
403 |
token_ability_missing |
Le jeton d'intégration n'a pas la capacité requise | Créer un jeton avec la capacité indiquée par required_ability |
403 |
session_token_required |
Route réservée aux jetons de session (auth/tokens) |
Utiliser un jeton issu de auth/login |
403 |
demo_mode |
Effet externe tenté depuis le cabinet de démonstration | Tester cette action sur un vrai cabinet |
422 |
token_limit_reached |
50 jetons d'intégration existent déjà | Révoquer les jetons inutilisés |
422 |
absent | Identifiants incorrects ou trop de tentatives | Lire errors.email |
Exemple de refus pour capacité manquante :
{
"message": "Ce jeton n'a pas la capacité requise pour cette action.",
"code": "token_ability_missing",
"required_ability": "write"
}
Bonnes pratiques
- Un jeton par intégration. Vous pourrez en révoquer un sans interrompre les autres, et la colonne de dernière utilisation restera lisible.
- Le moins de capacités possible. Un outil de reporting n'a besoin que de
read. - Une expiration. Fixez
expires_in_dayset planifiez le renouvellement avant l'échéance. - Un utilisateur dédié. Créez dans le cabinet un collaborateur réservé à l'intégration, avec le rôle strictement nécessaire. L'historique montrera clairement ce que l'intégration a fait.
- Un stockage chiffré. Conservez le jeton dans un gestionnaire de secrets ou une variable d'environnement, jamais dans le code source, un dépôt Git ou une application exécutée dans le navigateur de vos clients.
- HTTPS uniquement. N'envoyez jamais le jeton sur une connexion non chiffrée et ne le placez pas dans une URL.
Si un jeton a pu fuiter, révoquez-le tout de suite avec DELETE /v1/auth/tokens/{id}. Consultez ensuite l'onglet Historique des dossiers concernés pour vérifier les actions effectuées.