Envoyer une e-facture via l'endpoint SalesInvoice : upload dans tout format supporté, transformation automatique, routage et suivi de statut.
L'envoi d'une e-facture via l'API PSB est l'endpoint le plus utilisé. Vous envoyez un document XML à l'API dans le format que votre logiciel produit, et le PSB se charge de la validation, de la transformation automatique vers le format attendu par le destinataire, du routage et de la livraison via le réseau approprié.
POST /api/v1/{partyId}/salesInvoice/send
Le {partyId} dans l'URL est l'identifiant Peppol de l'organisation expéditrice (le fournisseur). La requête contient le document XML en tant que body (content-type application/xml). Le PSB détecte automatiquement le format du document et le valide. Vous pouvez livrer dans tout format supporté : UBL 2.1, NLCIUS, BIS Billing V3, PINT, CII, XRechnung, Factur-X, FatturaPA, ebInterface, Svefaktura, DICO, SETU et bien d'autres. Le PSB transforme automatiquement le document vers le format attendu par le destinataire.
Attention : la PSB détermine le destinataire sur la base de l'
EndpointIDdans votre document XML. Si cet élément est absent ou contient un identifiant incorrect, l'envoi échoue avec le statutInvoiceSentError. Assurez-vous que votre système source renseigne correctement l'EndpointID. Plus d'informations sur les identifiants et le routage dans l'article sur les identifiants Peppol.
La PSB prend en charge l'idempotency via le header de requête X-EConnect-DocumentId. En incluant votre propre UUID à chaque requête d'upload, vous empêchez le traitement en double :
X-EConnect-DocumentId: 550e8400-e29b-41d4-a716-446655440000
Si vous renvoyez le même documentId, l'API retourne 409 Conflict, indiquant à l'expéditeur que le document a déjà été traité.
Attention : Utilisez toujours un UUID/GUID comme documentId. N'utilisez jamais le numéro de facture, car cela provoque des problèmes si vous souhaitez renvoyer une version corrigée de la même facture.
Avant d'envoyer une facture, vous pouvez vérifier via queryRecipientParty si et comment le destinataire est joignable :
POST /api/v1/{partyId}/salesInvoice/queryRecipientParty
Dans le corps de la requête, vous transmettez une liste d'identifiants, par exemple ["0106:12345678"], ou un objet avec partyIds et metaAttributes. Les paramètres de requête optionnels sont ?preferredDocumentTypeId et ?includeOptions.
La réponse contient des informations sur :
Pour des lookups avancés incluant l'URL de l'Access Point et le certificat AP, une route distincte est disponible :
GET /api/v1/peppol/deliveryOption?partyIds={id}&documentFamily=Invoice&isCredit=false
En cas d'échec de livraison, la PSB applique automatiquement un mécanisme de réessai :
InvoiceSentRetry est publié pour chaque tentativeInvoiceSentError via votre webhookErreurs courantes lors de l'envoi :
InvoiceSentError comme statut final.Invalid payload — '{valeur}' n'est pas un xs:decimal valide sur un champ de montantcbc:TaxInclusiveAmount, cbc:PriceAmount, cbc:LineExtensionAmount) en notation scientifique, comme -1.336061E6 au lieu de -1336061.00. Les champs de montant UBL sont de type xs:decimal et le type XML Schema n'autorise pas la notation exponentielle ; seule la notation décimale fixe avec 2 décimales au maximum est valide. Se produit typiquement pour des montants importants ou négatifs sérialisés en interne comme double.E, pas de séparateurs de milliers). Signalez le problème au fournisseur du logiciel d'envoi ; eConnect ne peut pas corriger ceci car la valeur est dans le XML fourni.The string '' is not a valid Decimal value sur un champ PriceAmountcbc:PriceAmount) contient une chaîne vide ("") au lieu d'un nombre décimal sur une ou plusieurs lignes de facture. xs:decimal n'autorise pas une chaîne vide comme valeur lexicale. Cause différente de la notation scientifique, même classe de motif d'erreur.queryRecipientPartyRemarque : SI-UBL 1.2 (Simpler Invoicing 1.2) n'est plus autorisé sur le réseau Peppol depuis le 1er janvier 2024. Les factures dans ce format entraînent un
InvoiceSentError. Utilisez NLCIUS (SI-UBL 2.0) ou Peppol BIS Billing V3. Vérifiez leCustomizationIDdans votre document XML si vous rencontrez cette erreur.
Un upload réussi retourne 200 OK avec l'identifiant du document dans la PSB. Utilisez cet identifiant pour suivre le statut du document via l'API ou via les webhooks.
Contrairement à purchaseInvoice, l'endpoint salesInvoice ne dispose pas de DELETE. Il s'agit d'un choix délibéré, car une facture de vente envoyée ou rejetée est un événement de vie pertinent pour l'audit : le document reste traçable dans la piste d'audit, même après l'échec de l'envoi.
Les clients demandent parfois si une facture de vente rejetée peut être stoppée ou supprimée, par exemple après avoir déjà crédité la facture en interne. La réponse est :
Invalid payload) : la PSB place le document dans le statut final InvoiceSentError. Aucun réessai n'est exécuté (seules les erreurs 5xx sont réessayées). Le document n'est pas livré au destinataire malgré tout. Aucune action n'est requise sur la PSB ; le document est dans son statut final et est conservé 90 jours à des fins d'audit.Cette différence de cycle de vie entre salesInvoice (sans DELETE) et purchaseInvoice (avec DELETE) découle du rôle : une facture sortante est une action commerciale enregistrée par l'émetteur qui doit être juridiquement traçable ; une facture entrante peut être supprimée du système du destinataire après un téléchargement réussi.
Lors de l'envoi d'une facture, le PSB gère également la déclaration fiscale. Dans le cadre de la directive ViDA (VAT in the Digital Age), le PSB génère automatiquement un DRR (Digital Reporting Requirement) à partir des données de la facture et le transmet à l'administration fiscale compétente. En tant qu'intégrateur, vous n'avez rien de plus à faire : le DRR est dérivé de la même facture que vous envoyez via l'endpoint habituel. Les messages de statut et les messages de reporting CTC sont inclus dans le prix du document.
Par défaut, la PSB sélectionne automatiquement le meilleur canal. Avec le paramètre de requête ?channel={hookId}, vous pouvez forcer un canal de livraison spécifique (par ex. un réseau spécifique ou un fallback e-mail).
Les pièces jointes (PDF, images) peuvent être intégrées en base64 dans le document UBL en tant qu'AdditionalDocumentReference. La PSB traite correctement les pièces jointes intégrées et les livre avec la facture.
Remarque : L'endpoint d'envoi accepte un maximum de 24 MB par requête (overhead HTTP inclus). Avec des pièces jointes encodées en base64, la payload augmente d'environ 33%, un PDF de 18 MB produit donc une requête d'environ 24 MB. Les payloads dépassant la limite sont rejetées par le serveur web avec HTTP 500 (pas 413), avant que la validation applicative n'intervienne. Réduisez les pièces jointes volumineuses ou envoyez-les via un canal séparé.
Conseil : Le standard Peppol BIS Billing 3.0 actuel prend en charge un maximum d'une
OrderReferencepar facture. Si une facture concerne plusieurs commandes, plusieurs factures doivent être envoyées.
Conseil : Certains destinataires signalent des erreurs pour des factures avec un préfixe d'espace de noms XML (par ex.
<urn:Invoice>au lieu de<Invoice>). Les deux formes sont du XML techniquement valide selon la spécification W3C. Si un destinataire invoque cela comme raison de rejet, ce n'est pas un refus valide au sein du réseau Peppol. Le destinataire doit utiliser un parseur XML qui gère correctement les espaces de noms préfixés et par défaut.
Vous pouvez livrer dans tout format supporté par le PSB : UBL 2.1, NLCIUS, BIS Billing V3, PINT, CII, XRechnung, Factur-X, FatturaPA, ebInterface, Svefaktura, DICO, SETU et bien d'autres. Postez le document XML comme body vers POST /api/v1/{partyId}/salesInvoice/send avec Content-Type: application/xml. Le PSB détecte le format automatiquement, valide le document et le transforme vers le format attendu par le destinataire. Le destinataire est déterminé via le EndpointID dans votre XML.
Incluez le header X-EConnect-DocumentId avec un UUID unique à chaque upload. Si vous réutilisez le même documentId, l'API répond avec 409 Conflict, confirmant que le document a déjà été traité. N'utilisez jamais le numéro de facture comme documentId, car lors d'un renvoi corrigé, vous aurez besoin d'un nouvel identifiant.
Après un upload réussi, l'API retourne un identifiant de document dans la PSB que vous pouvez utiliser pour suivre le statut via l'API ou les webhooks. En cas d'erreurs temporaires 5xx côté destinataire, la PSB publie un événement InvoiceSentRetry par tentative et réessaie jusqu'à 8 fois sur environ 35 heures ; en cas d'échec définitif, vous recevez un événement InvoiceSentError.
Vous souhaitez d'abord tester si votre document est valide ? Utilisez la Validate API.
Essayer dans l'API