electronic-invoice.app

Valider les factures électroniques via l'API

Verdict, identifiants de règle, contrôles de plausibilité et validation par lot

Envoyez une facture électronique (par exemple une XRechnung au format UBL ou CII, ou un PDF ZUGFeRD) à POST /v1/validate. La réponse est un objet JSON contenant un verdict et l'ensemble des constatations, afin que votre processus de traitement des factures entrantes puisse écarter automatiquement les factures erronées.

Vérifier une facture

curl

curl -s -X POST 'https://api.electronic-invoice.app/v1/validate' \
  -H 'Authorization: Bearer eia_live_YOUR_KEY' \
  -H 'Content-Type: application/xml' \
  --data-binary @invoice.xml

Python (requests)

import requests

with open("invoice.xml", "rb") as f:
    r = requests.post(
        "https://api.electronic-invoice.app/v1/validate",
        headers={"Authorization": "Bearer eia_live_YOUR_KEY", "Content-Type": "application/xml"},
        data=f.read(),
        timeout=60,
    )
result = r.json()
print(result["verdict"])
for finding in result["findings"]:
    print(finding["severity"], finding["ruleId"], finding["message"])

La réponse

Une facture invalide renvoie également le statut 200 ; le verdict se trouve dans verdict : valid, warnings ou invalid. Ici, la référence de l'acheteur BT-10 est absente :

{
  "verdict": "invalid",
  "country": "DE",
  "detected": {
    "container": "xml",
    "syntax": "UBL-Invoice",
    "guidelineId": "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0",
    "profile": "XRECHNUNG",
    "scenario": "EN16931 XRechnung (UBL Invoice)"
  },
  "summary": { "errors": 1, "warnings": 0, "infos": 0 },
  "findings": [
    {
      "ruleId": "BR-DE-15",
      "severity": "error",
      "source": "schematron",
      "location": "/Invoice[1]",
      "message": "[BR-DE-15] Das Element \"Buyer reference\" (BT-10) muss übermittelt werden.",
      "explanation": {
        "de": "XRechnung: Die Käuferreferenz (BT-10, z. B. Leitweg-ID) ist Pflicht.",
        "en": "XRechnung: the buyer reference (BT-10, e.g. Leitweg-ID) is mandatory."
      }
    }
  ],
  "versions": {
    "xrechnungConfiguration": "xrechnung-3.0.2-validator-configuration-2026-08-31",
    "koSitValidator": "1.6.3",
    "mustang": "2.26.0",
    "cenSchematron": "1.3.16"
  }
}

source indique l'étape de validation (xsd, schematron, pdf, api, plausibility). versions enregistre le jeu de règles utilisé pour le contrôle ; vous pouvez le conserver avec le résultat.

Plausibilité : au-delà du format

Avec checks=plausibility, l'API contrôle également ce que les règles de format ne couvrent pas. Les constatations portent des identifiants de règle commençant par PL- et sont accompagnées d'un bloc distinct de valeurs calculées.

Identifiants de règleContrôle
PL-PFLMentions obligatoires de la facture au sens du § 14, alinéa 4, de la loi allemande relative à la TVA (UStG), rattachées aux termes métier (BT)
PL-ARITHTotaux de ligne, ventilation de la TVA et totaux généraux, tolérance de 0,01
PL-DATE, PL-VATDates et taux de TVA
PL-SKONTODate d'échéance, montant de l'escompte (Skonto) et période d'escompte issus des conditions de paiement
PL-VATIDFormat et clé de contrôle du numéro de TVA (USt-IdNr.), sans consultation auprès du BZSt ni de VIES
curl -s -X POST 'https://api.electronic-invoice.app/v1/validate?checks=plausibility' \
  -H 'Authorization: Bearer eia_live_YOUR_KEY' \
  -H 'Content-Type: application/xml' \
  --data-binary @invoice.xml | jq '.plausibility'

La réponse, abrégée :

{
  "verdict": "warnings",
  "summary": { "errors": 0, "warnings": 1, "infos": 1 },
  "computed": {
    "recalculated": {
      "sumOfLineNetAmounts": "200.00",
      "totalVat": "38.00",
      "totalWithVat": "238.00",
      "amountDue": "238.00"
    },
    "paymentTerms": { "dueDate": "2026-11-16", "daysFromIssueToDue": 14, "skonto": [] }
  }
}

L'avertissement dans cet exemple est PL-VATID-02 : le numéro d'exemple DE123456789 comporte une clé de contrôle erronée. Pour les factures dont le montant brut s'élève à 250 EUR au maximum (§ 33 du règlement d'application allemand en matière de TVA, UStDV), plusieurs mentions ne sont signalées qu'à titre indicatif.

Plusieurs factures à la fois

/v1/validate/batch accepte un fichier ZIP contenant jusqu'à 200 fichiers, jusqu'à 5 MiB par fichier et 50 MiB au total. L'API signale les numéros de facture en double d'un même vendeur au sein du lot sous l'identifiant PL-DUP-01. Avec report=csv ou report=pdf, vous obtenez un rapport de synthèse au lieu d'un objet JSON. Le traitement par lot est disponible à partir de l'offre Starter ; chaque fichier contrôlé compte comme un appel.

curl -s -X POST 'https://api.electronic-invoice.app/v1/validate/batch?report=csv' \
  -H 'Authorization: Bearer eia_live_YOUR_KEY' \
  -H 'Content-Type: application/zip' \
  --data-binary @inbox.zip \
  -o report.csv
file;status;verdict;errors;warnings;infos;syntax;profile;invoice_number;seller;duplicate_of;first_error_rule;first_error_message
a.xml;checked;invalid;1;0;0;UBL-Invoice;XRECHNUNG;RE-2026-0001;Test GmbH;b.xml;PL-DUP-01;Invoice number RE-2026-0001 of seller Test GmbH appears in 2 files of this batch (different content).

Ce que le contrôle ne fait pas

Les règles contrôlent le format, les règles métier et, avec checks=plausibility, les points énumérés ci-dessus. L'API ne peut pas savoir si la prestation, le taux de TVA ou les coordonnées bancaires sont corrects sur le fond. Les formats couverts par la validation, ainsi que la profondeur du contrôle, sont indiqués dans le tableau des formats pris en charge. Pour les formats marqués « schéma uniquement » ou « règles de base uniquement », les autorités ou les règles nationales effectuent des contrôles supplémentaires ; un verdict favorable ne les remplace donc pas. Contrôlez les règles françaises avec country=FR.

Offres

Free : 0 EUR par mois, 50 appels. Starter : 19 EUR par mois, 2 000 appels. Business : 49 EUR par mois, 10 000 appels. Pro : 149 EUR par mois, 50 000 appels. Prix mensuels fixes, pas de facturation à l'usage ; lorsque le quota est épuisé, l'API répond avec 429. Pour les entreprises uniquement. Aucune TVA n'est facturée en application du § 19 de la loi allemande sur la TVA (UStG). Plus de limites

Contrairement au validateur gratuit dans le navigateur, votre facture transite par le réseau Cloudflare jusqu'à notre serveur à Nuremberg. L'API la traite en mémoire et ne stocke pas le contenu de la facture. Vous pouvez générer des factures avec XRechnung via l'API et ZUGFeRD via l'API ; il vous appartient de les envoyer au destinataire.

Questions fréquentes

Une facture invalide compte-t-elle comme un appel ?

Oui. Une facture invalide constitue une réponse normale avec le statut 200 et compte comme un appel.

S'agit-il du validateur KoSIT ?

L'API exécute le validateur KoSIT publié avec la configuration XRechnung. Il ne s'agit ni d'un service KoSIT ni d'une approbation officielle. Nos tests sont des tests réalisés sur des fichiers d'exemple, et non une certification.

La facture validée est-elle stockée ?

Non. Elle est traitée en mémoire et les journaux de l'application ne contiennent aucun contenu de facture.

Les textes juridiques sont disponibles en allemand et en anglais : politique de confidentialité, conditions de l'API et mentions légales. Seule la version allemande fait foi.