Valinvo

Démarrage rapide

Statut : bêta. Valinvo transforme une facture JSON en Factur-X, CII ou UBL avec les règles françaises (France), en ZUGFeRD 2.5.2 / Factur-X 1.09.2 (PDF avec le XML intégré), en XRechnung 3.0.2 (Allemagne, UBL ou CII) ou en Peppol BIS Billing 3.0.21 (Belgique et réseau Peppol). Chaque facture générée est contrôlée selon les règles officielles de son format avant d'être renvoyée.

Conditions : l'API est réservée aux entreprises et soumise aux conditions d'utilisation et à l'accord de traitement des données (la version anglaise fait foi). Sans clé API, vous les acceptez en envoyant l'en-tête X-Accept-Terms: 1.0 (la version en vigueur) avec chaque requête ; les requêtes sans cet en-tête sont refusées avec 428 terms_not_accepted. Les titulaires d'une clé API acceptent par écrit lors de sa délivrance. Chaque réponse de l'API renvoie aux conditions dans l'en-tête Link: <…/terms>; rel="terms-of-service". L'essai sans clé API sert uniquement aux tests et à l'évaluation : utilisez des données d'exemple, pas de vraies factures contenant des données personnelles de tiers.

Support : n'envoyez jamais de vraies factures par e-mail. Envoyez le résultat de validation (identifiants de règles et emplacements des champs) ou une copie anonymisée avec des valeurs d'exemple à hello@bmk-hub.com, ou utilisez le formulaire de contact.

Lister les formats

curl https://valinvo.bmk-hub.com/v1/formats

Créer une facture

Envoyez le format et la facture dans un seul corps JSON. Deux exemples complets : XRechnung (Allemagne) et Peppol (Belgique).

curl -X POST https://valinvo.bmk-hub.com/v1/invoices \
  -H 'X-Accept-Terms: 1.0' \
  -H 'Content-Type: application/json' \
  -d @invoice.peppol-be.example.json \
  -o facture.xml -D -

La réponse est le fichier XML. Les en-têtes donnent le résultat du contrôle officiel :

X-Validation-Status: valid
X-Validation-Warnings: 0
X-Rule-Set: peppol-bis-3.0.21-ubl-invoice

Ajoutez -H 'Accept: application/json' pour recevoir le XML et le rapport de contrôle complet dans une seule réponse JSON.

Avec "format": "zugferd-en16931", la réponse est un PDF (enregistrez-le avec -o facture.pdf) ; les règles officielles contrôlent le XML qu'il contient. En mode JSON, le PDF est encodé en base64. Une facture sans date de livraison reçoit un avertissement (PEPPOL-EN16931-R008, élément de livraison vide) : le schéma ZUGFeRD impose cet élément, cet avertissement est donc normal.

Essai gratuit et clés d'API

Sans clé, vous pouvez créer 2 factures par jour (par adresse IP) pour essayer l'API ; les en-têtes X-Trial-Limit et X-Trial-Remaining indiquent où vous en êtes, puis vous recevez 429 trial_limit_reached. Les partenaires de conception reçoivent une clé bêta (Authorization: Bearer <clé>) sans limite quotidienne. Le valideur reste gratuit.

Sans clé, envoyez une requête à la fois (sinon 429 one_request_at_a_time). Limites de taille pour tous : JSON de facture jusqu'à 2 Mo et 2 000 lignes ; PDF ZUGFeRD jusqu'à 500 lignes et 5 000 caractères par champ de texte ; au plus 1 000 notes (100 dans les PDF) ; nombres d'au plus 15 chiffres avant et 10 après la virgule (400 invalid_invoice) ; documents à valider jusqu'à 20 Mo et 75 000 éléments XML, environ 3 000 lignes détaillées (413 document_too_large).

Règles simples

En cas d'erreur

Vous recevez 400 avec tous les problèmes d'un coup, chacun avec le chemin JSON, la règle officielle et le terme métier EN 16931. Les messages de l'API sont en anglais :

{
  "code": "invalid_invoice",
  "message": "The invoice has 1 problem. Fix it and try again.",
  "problems": [{
    "path": "invoice.buyerReference",
    "message": "Peppol requires buyerReference or orderReference.",
    "rule": "PEPPOL-EN16931-R003",
    "businessTerm": "BT-10"
  }]
}

422 generated_invoice_invalid signifie que le XML généré ne respecte pas les règles officielles ; validation.errors en donne la raison. Le plus souvent, un champ exigé par une règle nationale manque.

Valider une facture existante

curl -X POST https://valinvo.bmk-hub.com/v1/validate \
  -H 'X-Accept-Terms: 1.0' \
  -H 'Content-Type: application/xml' \
  --data-binary @facture.xml
{"ruleSet": "peppol-bis-3.0.21-ubl-invoice", "valid": true, "errors": [], "warnings": []}

Le jeu de règles est détecté à partir du document : XRechnung 3.0 (UBL Invoice, UBL CreditNote, CII), Peppol BIS Billing 3.0 (UBL Invoice, UBL CreditNote) et ZUGFeRD 2.x / Factur-X en CII (profils MINIMUM, BASIC WL, BASIC, EN 16931 et EXTENDED, contrôlés selon les règles 2.5.2). Une facture invalide est un résultat 200 normal avec valid: false et la liste des erreurs.

Un PDF ZUGFeRD / Factur-X peut être envoyé tel quel. Nous contrôlons le XML de facture qu'il contient, le PDF lui-même selon PDF/A-3 (avec veraPDF) et que les métadonnées du PDF indiquent le même profil et la même pièce jointe que le XML ; le jeu de règles devient par exemple zugferd-2.5.2-en16931+pdf-a-3b. Les erreurs PDF/A ont des ID comme PDF/A-3 6.2.11.4.1-1 (section et test de l'ISO 19005-3), les erreurs de métadonnées commencent par ZF-XMP :

curl -X POST https://valinvo.bmk-hub.com/v1/validate \
  -H 'X-Accept-Terms: 1.0' \
  -H 'Content-Type: application/pdf' \
  --data-binary @facture.pdf

Un PDF sans pièce jointe de facture reçoit 400 no_embedded_invoice ; un PDF illisible ou protégé par mot de passe, 400 invalid_pdf.

OpenAPI

Toute l'API en description OpenAPI 3 : openapi.json. Importez-la dans Postman, Insomnia ou un générateur de code.

Démarrage rapide · Valideur Peppol · Valideur Factur-X · Codes d'erreur