Payer les factures en toute sécurité
Vous êtes sur le point de payer une facture fournisseur ou de modifier le compte bancaire d'une fiche fournisseur. Avant que de l'argent ne soit transféré, exécutez les vérifications ci-dessous et transmettez leurs résultats à la personne qui approuve le paiement.
Utilisez cette compétence lorsque :
- un fournisseur (ou quelqu'un se faisant passer pour le fournisseur) envoie de nouvelles coordonnées bancaires ;
- l'IBAN sur une facture diffère du compte présent dans la fiche fournisseur ;
- vous préparez une exécution de paiement et souhaitez que chaque facture soit d'abord vérifiée ;
- on vous demande « cette facture est-elle payable ? ».
Les deux vérifications gratuites ne nécessitent ni compte ni token.
Connexion
Serveur MCP (HTTP streamable, JSON-RPC 2.0) :
{
"mcpServers": {
"jithox": { "url": "https://jithox.com/api/mcp" }
}
}
Le HTTP simple fonctionne également ; chaque exemple ci-dessous est un appel curl. Définissez votre propre user-agent comme indiqué, afin que ces appels puissent être distingués des autres trafics.
Étape 1 – Un compte bancaire nouveau ou modifié : check_payment_change
Appelez-le lorsqu'un fournisseur fournit un nouveau compte, et lorsque l'IBAN sur la facture n'est pas celui du fichier (dans ce cas, l'IBAN de la facture est le nouveau). Laissez ibanOnFile vide pour un premier paiement à un nouveau fournisseur ; la réponse indiquera alors que rien n'a pu être comparé.
curl -s https://jithox.com/api/mcp \
-A 'pay-invoices-safely/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_payment_change","arguments":{"newIban":"DK27 5301 0244 5638 21","ibanOnFile":"DK50 0040 0440 1162 43","supplierCountry":"DK"}}}'
Le résultat de l'outil (result.content[0].text), exécuté en production le 2026-09-24 et raccourci là où il y a des … :
{
"kind": "payment_change_check",
"data": {
"verdict": "verify_first",
"summary": "Le nouveau numéro est un compte bien formé et rien ne se démarque. Il s'agit néanmoins d'un changement de destination des fonds : confirmez-le par téléphone avant de mettre à jour la fiche.",
"newAccount": { "status": "valid", "iban": "DK27 5301 0244 5638 21", "country": "Denmark", … },
"accountOnFile": { "status": "valid", "iban": "DK50 0040 0440 1162 43", "country": "Denmark", … },
"flags": [
{ "code": "bank_changed", "severity": "note", "what": "Même pays, banque différente (identifiant 0040 → 5301). Normal en soi — les entreprises changent de banque — et bon à mentionner lors de l'appel." }
],
"requiredSteps": [
"Appelez le fournisseur sur un numéro de téléphone provenant de VOS propres archives ou d'une facture précédente et payée — jamais celui de la demande de modification ou de sa signature électronique.",
"Demandez-lui de vous lire le nouveau numéro de compte ; ne le lisez pas vous-même.",
"Faites approuver la modification de la fiche fournisseur par une deuxième personne avant toute exécution de paiement.",
"Conservez la demande, le nom de la personne à qui vous avez parlé et l'heure de l'appel avec la fiche fournisseur."
],
"doesNotProve": "Qui possède le nouveau compte, qu'il existe ou est ouvert, ou que la demande émane du fournisseur. Aucun registre gratuit ne répond à ces questions. Seul le rappel le fait.",
…
}
}
Agissez en fonction du verdict :
verdict | Ce que vous faites |
|---|---|
no_change | Le même compte, écrit différemment. Passez à l'étape 2. Si la demande insistait sur la nouveauté des coordonnées, cette incohérence mérite un appel. |
verify_first | Ne payez pas et ne modifiez pas la fiche fournisseur. Transmettez les requiredSteps à une personne. |
stop | Drapeaux rouges. Ne payez pas, bloquez les autres paiements à ce fournisseur, transmettez flags et requiredSteps à une personne. |
invalid_new_account | Le numéro ne peut pas être un IBAN. Ne payez pas. Demandez le numéro au fournisseur via un canal que vous connaissez déjà. |
| Pas de réponse (timeout, erreur HTTP ou erreur d'outil) | Ce n'est pas une réussite. Ne payez pas et ne modifiez pas la fiche fournisseur ; transmettez à une personne. |
Le rappel est la vérification. Une personne appelle le fournisseur sur un numéro de téléphone qui NE provient PAS de l'e-mail, de la demande de modification ou de la facture. Vous ne pouvez pas passer cet appel pour elle, et un IBAN bien formé n'est pas un IBAN sûr.
Le même appel pour les cas stop, no_change et invalid_new_account se trouve dans references/examples.md.
Étape 2 – La facture elle-même : POST /api/invoice/review (gratuit)
Envoyez la facture sous forme de données structurées. Il vérifie la structure, recalcule les totaux, vérifie l'IBAN et applique les règles Peppol BIS Billing 3.0. Pas de compte, pas de token, rien n'est facturé. Comme review_invoice, il lit des données structurées, pas un PDF ou un scan : convertissez-les d'abord en champs.
curl -s https://jithox.com/api/invoice/review \
-A 'pay-invoices-safely/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{"invoice":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Impression, septembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}'
Exécuté en production le 2026-09-24, raccourci :
{
"review": {
"checks": [
{ "id": "structure", "status": "pass", … },
{ "id": "arithmetic", "status": "pass", "detail": "Les totaux des lignes et la TVA correspondent aux montants de la facture.", … },
{ "id": "payment_details", "status": "pass", "detail": "DK27 5301 0244 5638 21 est un IBAN danois structurellement valide. Cela ne signifie pas que le compte existe ou à qui il appartient.", … },
{ "id": "supplier_vat", "status": "skipped", "detail": "Le registre VIES n'a pas été interrogé : cette exécution n'avait pas d'espace de travail autorisé pour cela.", … },
{ "id": "customer_vat", "status": "skipped", … },
{ "id": "peppol", "status": "pass", … }
],
"findings": [],
"readyToSend": true,
"hasUnknowns": true,
…
},
"verified": false,
"billing": { "charged": false, "reason": "Déconnecté : seules les vérifications locales gratuites ont été exécutées, rien n'a été facturé.", … }
}
Comment lire :
- Sans compte, les deux vérifications de TVA sont
skipped: le registre VIES n'a pas été interrogé. C'est pourquoihasUnknownsest true. Dites-le à la personne ; ne rapportez jamais les numéros de TVA comme vérifiés. - Chaque entrée dans
findingsa uneseverityet unfix. Unblockersignifie que la facture est erronée (par exemple, un total qui ne correspond pas) : ne la payez pas, demandez une facture corrigée au fournisseur. Un exemple se trouve dans references/examples.md. payment_detailsindique seulement que l'IBAN est bien formé. Savoir s'il s'agit du compte du fournisseur relève de l'étape 1, pas de cette vérification.
Étape 3 – Numéros de TVA depuis le registre européen : review_invoice (payant)
Exécutez cette étape uniquement après l'étape 2. Elle répète les vérifications structurées de la facture et ajoute les vérifications des numéros de TVA du fournisseur et du client auprès du registre VIES de l'UE. Son schéma d'entrée en direct lit le paiement et les totaux déclarés de la facture. Elle nécessite un token :
- Une personne (pas l'agent) crée une connexion Jithox sur https://jithox.com/mcp/account#connection.
- L'agent échange l'identifiant et le secret de la connexion contre un token sur /api/oauth/token :
curl -s https://jithox.com/api/oauth/token \
-A 'pay-invoices-safely/1.0' \
-H 'Accept: application/json' \
-d grant_type=client_credentials \
-d "client_id=$JITHOX_CLIENT_ID" \
-d "client_secret=$JITHOX_CLIENT_SECRET"
Placez le token d'accès de la réponse dans JITHOX_TOKEN. Un token expiré ou refusé donne la même réponse payment_required que l'absence de token. Récupérez un nouveau token et réessayez une fois.
- Appelez l'outil avec le token (les champs de la facture vont directement dans
arguments) :
curl -s https://jithox.com/api/mcp \
-A 'pay-invoices-safely/1.0' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "Authorization: Bearer $JITHOX_TOKEN" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"review_invoice","arguments":{"invoiceNumber":"2026-0917","issueDate":"2026-09-17","dueDate":"2026-10-17","currency":"DKK","buyerReference":"PO-4471","supplier":{"name":"Nordlys Tryk ApS","countryCode":"DK","vatId":"DK31500060","endpointId":"5790000000012","endpointScheme":"0088"},"customer":{"name":"Havn Logistik A/S","countryCode":"DK","vatId":"DK31500044","endpointId":"5790000000029","endpointScheme":"0088"},"lines":[{"description":"Impression, septembre","quantity":1,"unitPrice":8000,"vatPercent":25}],"totalWithoutVat":8000,"totalVat":2000,"totalWithVat":10000,"payment":{"iban":"DK27 5301 0244 5638 21"}}}}'
Le prix ne figure pas dans ce fichier, car les prix changent : lisez le champ pricing de review_invoice dans https://jithox.com/mcp.json. Sans token, l'outil répond payment_required, n'exécute rien et indique humanUrl et tokenUrl.
Avec un token, exécuté en production le 2026-09-24, raccourci :
{
"kind": "invoice_review",
"data": {
"checks": [
…
{ "id": "supplier_vat", "status": "unknown", "source": "eu_vies", "detail": "Le registre VIES n'a pas répondu." },
{ "id": "customer_vat", "status": "fail", "source": "eu_vies", "detail": "VIES indique que ce numéro n'est pas enregistré." },
…
],
"findings": [
{ "code": "supplier_vat_unverified", "severity": "warning", "what": "Nous n'avons pas pu rendre de verdict sur le numéro de TVA DK31500060. Le registre VIES n'a pas répondu.", "fix": "Réexaminez plus tard. Considérez-le comme non vérifié — ce n'est pas une preuve que le numéro est bon ou mauvais." },
{ "code": "customer_vat_not_registered", "severity": "blocker", "what": "VIES ne connaît pas le numéro de TVA DK31500044.", "fix": "Vérifiez le numéro auprès du client — une faute de frappe, une inscription fermée ou un numéro hors UE ressembleraient à cela." }
],
"readyToSend": false,
"hasUnknowns": true,
…
}
}
unknown n'est pas une réussite : le registre n'a pas répondu, donc le numéro n'est pas vérifié. Un fail sur le numéro de TVA du fournisseur est une raison de bloquer le paiement et de demander. Les numéros de TVA dans ces exemples sont fictifs, donc le registre ne les connaît pas.
Étape 4 – Décidez et indiquez ce qui n'a pas été vérifié
Jithox ne paie jamais et ne signe jamais un paiement, et aucun de ces appels ne demande un identifiant bancaire ou une clé de signature. Vous préparez ; une personne approuve le paiement.
Bloquez le paiement et transmettez-le à une personne lorsque l'une des conditions suivantes est vraie :
- l'étape 1 a donné un
verdictautre queno_change; - l'étape 2 n'a pas renvoyé de réponse sans résultat de sévérité
blocker; - l'étape 3 a un résultat de sévérité
blocker; - une vérification de TVA dont vous aviez besoin est
skipped,unknownoufail. - une vérification n'a donné aucune réponse : un timeout, une erreur HTTP, une erreur JSON-RPC ou une erreur d'outil n'est pas une réussite. Ne payez pas ; transmettez à une personne.
Même lorsque tout réussit, une réponse propre n'est pas une garantie. Mettez le texte doesNotProve de l'étape 1 et le detail de chaque vérification qui n'est pas pass dans votre note, mot pour mot. Une note courte :
Facture 2026-0917 de Nordlys Tryk ApS, DKK 10000.00 vers DK27 5301 0244 5638 21.
Compte bancaire : verify_first (banque changée 0040 -> 5301). NON payé.
Appelez le fournisseur au numéro dans nos propres archives ; demandez-lui de lire le compte.
Non prouvé : qui possède le nouveau compte, qu'il existe ou est ouvert, ou que la demande émane du fournisseur.
Facture : structure, totaux, format IBAN et règles Peppol réussis.
TVA : non vérifiée (ignorée, pas de compte).
Nécessite : rappel + seconde approbation avant paiement.