Ironfang Finance valide les factures et avoirs XRechnung dans ses deux syntaxes, UBL 2.1 et UN/CEFACT CII, par rapport à la configuration officielle du validateur XRechnung, et les lit comme des documents. Essayez-le sans compte dans le validateur XRechnung et la visionneuse XRechnung, également en allemand.
Ce qui est contrôlé
Un document passe par ces étapes dans l'ordre. Une étape qui échoue arrête les suivantes, et le résultat indique que chacune n'a pas été atteinte plutôt que réussie.
| Étape | Ce qu'elle contrôle |
|---|---|
input | La taille et le cadrage de la requête, avant toute analyse. |
xml | Un XML bien formé dans les limites, sans DTD, sans entités au-delà des cinq prédéfinies et sans XInclude. |
xsd | Le schéma XML de la syntaxe du document : UBL 2.1, ou UN/CEFACT CII D16B, l'édition qu'utilise XRechnung. |
en16931 | Les règles métier de la norme européenne, dans l'édition que fixe le paquet XRechnung. |
xrechnung | Les règles XRechnung (BR-DE-* et les règles issues de Peppol qu'inclut XRechnung). |
Les règles sont la configuration officielle exécutée octet pour octet, avec les niveaux qu'elle fixe. Cette configuration abaisse certaines règles par rapport à leur propre indicateur, si bien qu'un constat porte les deux : severity, qui décide du résultat, et rule_flag, celui de la règle elle-même. Seuls les constats fatal (erreur) font échouer un document ; warning (avertissement) et information jamais.
Versions et variantes
- XRechnung 3.0.2, dans le paquet technique du 31 août 2026. Le résultat indique la version exacte dans
ruleset.official_releaseetruleset.technical_release. - UBL 2.1 Invoice et CreditNote ; factures et avoirs CII, leur nature étant déterminée par le code de type.
- La variante de base (core). L'Extension et la variante CVD sont reconnues et refusées avec
unsupported_variant, jamais contrôlées par rapport aux règles de base comme si elles étaient autre chose. - XML uniquement. Un PDF, y compris ZUGFeRD et Factur-X, reçoit la réponse
scope_unavailable.
Valider avec l'API
POST /finance/v2/einvoices/validate reçoit le XML comme corps de la requête. Indiquez la famille, comme le fait ce script, afin qu'un document qui ne déclare aucune famille soit tout de même contrôlé comme XRechnung et qu'un document qui en déclare une autre soit refusé avec ce qu'il déclare. Le script conserve le résultat dans result.json et dérive l'Idempotency-Key du fichier, si bien qu'une nouvelle tentative renvoie le premier résultat et n'est pas décomptée une seconde fois.
#!/usr/bin/env bash
# Validate one XRechnung with the Ironfang Finance API and keep the result.
#
# IRONFANG_API_KEY=... ./validate-xrechnung.sh invoice.xml
#
# The result is written to result.json. A retry with the same file sends
# the same Idempotency-Key, so it returns the first result and is not
# charged again.
set -euo pipefail
file="$1"
base="${IRONFANG_FINANCE_API:-https://api.ironfang.uk/finance}"
key="xr-$(sha256sum "$file" | cut -c1-40)"
curl --fail-with-body --silent --show-error \
"$base/v2/einvoices/validate?family=xrechnung" \
-H "Authorization: Bearer $IRONFANG_API_KEY" \
-H "Content-Type: application/xml" \
-H "Idempotency-Key: $key" \
--data-binary "@$file" \
--output result.json
grep -o '"outcome":"[a-z]*"' result.json | head -n 1
| Paramètre de requête | Signification |
|---|---|
family | xrechnung. Sans lui, la famille est lue dans l'identifiant de spécification du document. |
variant | core, la valeur par défaut pour XRechnung. |
document_type | invoice, credit_note ou auto (la valeur par défaut : lu dans le document). |
ruleset | latest (la valeur par défaut) ou l'identifiant exact d'une version, tiré de GET /finance/v2/einvoices/rulesets. Une version exacte fixe toute la sélection ; un sélecteur qui la contredit donne selection_conflict. |
Sans clé API, la même requête est anonyme : rien n'est conservé et des limites de débit plus strictes s'appliquent. Avec une clé, une validation terminée compte pour une opération de votre quota Finance, décomptée dès que le contrôle du schéma aboutit à un verdict, et le résultat est conservé 30 jours à l'adresse GET /finance/v2/einvoices/results/{id}. Le contrat complet est le document OpenAPI V2, et les différences entre V2 et V1 sont décrites dans le guide V1 et V2.
Lire un résultat
outcome vaut valid ou invalid pour une validation terminée ; tout ce qui a empêché un verdict, comme un dépassement de délai, est une réponse Problem avec outcome: indeterminate, et rien n'est décompté. coverage indique ce que le résultat établit : au niveau XML, le document XML et rien sur un PDF. Chaque constat porte son identifiant de règle inchangé, un message fixe pour son étape et un XPath dans location ; les textes officiels des règles ne sont pas repris, car ils peuvent contenir des valeurs de la facture. next_actions inclut view lorsque le document peut être ouvert dans la visionneuse.
Règles expliquées
Ces règles ont une explication relue, en anglais et en allemand, que les outils affichent à côté du constat. Chacune a été vérifiée auprès du validateur officiel avec un fichier de test qui l'enfreint.
| Règle | Niveau | Signification |
|---|---|---|
BR-DE-1 | erreur | Les instructions de paiement sont absentes |
BR-DE-2 | erreur | Le contact du vendeur est absent |
BR-DE-3 | erreur | La ville du vendeur est absente |
BR-DE-4 | erreur | Le code postal du vendeur est absent |
BR-DE-5 | erreur | Le point de contact du vendeur est absent |
BR-DE-6 | erreur | Le numéro de téléphone du contact du vendeur est absent |
BR-DE-7 | erreur | L'adresse e-mail du contact du vendeur est absente |
BR-DE-8 | erreur | La ville de l'acheteur est absente |
BR-DE-9 | erreur | Le code postal de l'acheteur est absent |
BR-DE-10 | erreur | L'adresse de livraison n'a pas de ville |
BR-DE-11 | erreur | L'adresse de livraison n'a pas de code postal |
BR-DE-15 | erreur | La référence de l'acheteur (Leitweg-ID) est absente |
BR-DE-16 | erreur | Le numéro de TVA ou le numéro fiscal du vendeur est absent |
BR-DE-17 | avertissement | Le code de type de facture n'est pas l'un de ceux qu'attend XRechnung |
BR-DE-19 | avertissement | Le compte de paiement n'est pas un IBAN valide |
BR-DE-23-a | erreur | Un virement n'indique aucun compte |
BR-DE-23-b | erreur | Un virement comporte aussi des données de carte ou de prélèvement |
BR-DE-24-a | erreur | Un paiement par carte n'a pas de données de carte |
BR-DE-24-b | erreur | Un paiement par carte comporte aussi un compte ou un prélèvement |
BR-DE-27 | avertissement | Le numéro de téléphone du contact a moins de trois chiffres |
BR-DE-28 | avertissement | L'adresse e-mail du contact du vendeur ne semble pas valide |
BR-TMP-2 | erreur | L'emplacement d'un justificatif n'est pas une URL absolue |
BR-DE-TMP-32 | information | Aucune date de livraison ni période de prestation n'est indiquée |
PEPPOL-EN16931-R001 | erreur | Le processus métier est absent |
PEPPOL-EN16931-R008 | erreur | Le document contient un élément vide |
PEPPOL-EN16931-R010 | erreur | L'adresse électronique de l'acheteur est absente |
PEPPOL-EN16931-R020 | erreur | L'adresse électronique du vendeur est absente |
PEPPOL-EN16931-R046 | erreur | Le prix net n'est pas le prix brut diminué de sa remise |
PEPPOL-EN16931-R110 | erreur | La période d'une ligne commence avant la période de facturation |
PEPPOL-EN16931-R111 | erreur | La période d'une ligne se termine après la période de facturation |
PEPPOL-EN16931-R120 | avertissement | Le montant net d'une ligne ne correspond pas à la quantité et au prix |
PEPPOL-EN16931-R121 | erreur | La quantité de base du prix est nulle |
PEPPOL-EN16931-R130 | erreur | La quantité de base du prix est dans une autre unité |
Affichage
POST /tools/v2/invoice/view lit un document UBL ou CII dans le modèle invoice-view/2 : les parties, les lignes, la ventilation de la TVA, les totaux et les données de paiement du document, chaque valeur étant la chaîne exacte de la source, avec son chemin XML et sa ligne. Les dates CII sont lues d'après leur code de format ; une date dans un format qui ne peut pas être lu de façon sûre est conservée telle qu'écrite, avec une remarque. Un montant sans devise propre n'en a aucune : la devise du document n'est jamais supposée. Tout ce que le modèle n'affiche pas est compté dans unshown_elements, et les premiers éléments sont nommés dans des remarques, de sorte qu'une lecture partielle le signale. L'affichage ne valide jamais.
Réponses d'erreur
| Code | Quand |
|---|---|
family_mismatch | Le document déclare une autre famille que celle indiquée ; detected indique ce qu'il déclare. |
family_undetected | Aucune famille n'a été indiquée et le document n'en déclare aucune que reconnaît Ironfang. |
unsupported_variant | L'Extension XRechnung ou CVD. |
unsupported_document_type | Ni une facture ni un avoir, ou un type qui contredit celui indiqué. |
scope_unavailable | Un PDF, ou une portée hybride demandée pour du XML. |
payload_too_large | XML de plus de 5 Mio. |
idempotency_conflict | La même Idempotency-Key a été utilisée pour d'autres octets ou une autre sélection. |
validator_unavailable, validation_timeout, internal_error | Aucun verdict : indéterminé et non décompté. Réessayez. |

