Envoyer une facture self-billing via l'API

Implémenter le self-billing : variante NLCIUS et BIS Self-Billing 3.0, vérifier les capabilities.

En tant qu'acheteur, vous pouvez via l'API PSB établir et envoyer une facture self-billing au nom de votre fournisseur. Cet article décrit étape par étape comment procéder pour les deux variantes : la variante NLCIUS et Peppol BIS Self-Billing 3.0.

Préalable : vérifier les capabilities

Vérifiez toujours d'abord si le fournisseur peut recevoir le format self-billing souhaité :

GET /api/v1/queryRecipientParty?identifier={schemeID}:{leverancierKvK} HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}

Recherchez dans la réponse le profil supporté. Pour le NLCIUS, il s'agit du profil de facture standard ; pour le BIS Self-Billing 3.0, du profil self-billing spécifique.

Variante 1 : NLCIUS (simplifié)

C'est la manière la plus simple d'envoyer une facture self-billing. Vous utilisez les mêmes CustomizationID et ProfileID que pour une facture NLCIUS standard, mais vous changez le InvoiceTypeCode en 389 :

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
  <CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:nen.nl:nlcius:v1.0</CustomizationID>
  <ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</ProfileID>
  <ID>SB-2026-001</ID>
  <IssueDate>2026-03-05</IssueDate>
  <InvoiceTypeCode>389</InvoiceTypeCode>
  <!-- AccountingSupplierParty = de leverancier (ontvanger van de factuur) -->
  <AccountingSupplierParty>
    <Party>
      <EndpointID schemeID="0106">87654321</EndpointID>
      <PartyName><Name>Leverancier B.V.</Name></PartyName>
      ...
    </Party>
  </AccountingSupplierParty>
  <!-- AccountingCustomerParty = de koper (opsteller van de factuur) -->
  <AccountingCustomerParty>
    <Party>
      <EndpointID schemeID="0106">12345678</EndpointID>
      <PartyName><Name>Koper B.V.</Name></PartyName>
      ...
    </Party>
  </AccountingCustomerParty>
  ...
</Invoice>

Envoyez le document via l'endpoint SalesInvoice :

POST /api/v1/{partyId}/salesInvoice/send HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}
Content-Type: application/xml
X-EConnect-DocumentId: {uuid}

Le PSB reconnaît automatiquement l'InvoiceTypeCode 389 et route le document en tant que facture self-billing vers le fournisseur.

Conseil : pour une note de crédit self-billing, utilisez l'InvoiceTypeCode 261 au lieu de 389.

Variante 2 : BIS Self-Billing 3.0

Avec cette variante, vous utilisez le profil self-billing spécifique avec ses propres identifiants :

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
  <CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:selfbilling:3.0</CustomizationID>
  <ProfileID>urn:fdc:peppol.eu:2017:poacc:selfbilling:3.0</ProfileID>
  <ID>SB-2026-001</ID>
  <IssueDate>2026-03-05</IssueDate>
  <InvoiceTypeCode>389</InvoiceTypeCode>
  <AccountingSupplierParty>
    <Party>
      <EndpointID schemeID="0106">87654321</EndpointID>
      <PartyName><Name>Leverancier B.V.</Name></PartyName>
      ...
    </Party>
  </AccountingSupplierParty>
  <AccountingCustomerParty>
    <Party>
      <EndpointID schemeID="0106">12345678</EndpointID>
      <PartyName><Name>Koper B.V.</Name></PartyName>
      ...
    </Party>
  </AccountingCustomerParty>
  ...
</Invoice>

Envoyez les documents BIS Self-Billing via l'endpoint Generic :

POST /api/v1/{partyId}/generic/send HTTP/1.1
Host: psb.econnect.eu
Authorization: Bearer {access_token}
Content-Type: application/xml
X-EConnect-DocumentId: {uuid}

Le PSB détecte le profil self-billing sur la base du CustomizationID et route le document vers le fournisseur, à condition que celui-ci soit enregistré pour le profil BIS Self-Billing 3.0.

Différence dans les rôles

Notez la différence dans les rôles des parties en self-billing. C'est une source fréquente de confusion :

Élément UBLFacture standardFacture self-billingAccountingSupplierPartyL'expéditeur (fournisseur)Le destinataire (fournisseur)AccountingCustomerPartyLe destinataire (acheteur)L'expéditeur (acheteur)

L'AccountingSupplierParty est toujours le fournisseur, même lorsque l'acheteur établit la facture. L'acheteur renseigne ses propres données dans AccountingCustomerParty.

Idempotency

Utilisez toujours le header X-EConnect-DocumentId pour éviter les envois en double. Les règles sont identiques à celles des factures standard : minimum 6 caractères, de préférence un UUID, jamais le numéro de facture. En savoir plus dans l'article Idempotency.

Gestion des erreurs

Erreurs courantes en self-billing :

ErreurCauseSolutionErreur de validationInvoiceTypeCode manquant ou incorrectVérifiez que l'InvoiceTypeCode est 389 ou 261Destinataire non trouvéFournisseur non enregistré pour le self-billingVérifiez via queryRecipientParty ; pour le BIS Self-Billing, le fournisseur doit être enregistré séparément409 ConflictUn document avec cet ID a déjà été traitéAucune action nécessaire
Notifications webhook

Après l'envoi, vous recevez les mêmes événements webhook que pour les factures standard :

  • InvoiceSent en cas de livraison réussie
  • InvoiceSentRetry en cas de nouvelle tentative (max 8 retries)
  • InvoiceSentError si la livraison échoue définitivement
Questions fréquentes
Quel endpoint utiliser pour le self-billing NLCIUS versus BIS Self-Billing 3.0 ?

Pour NLCIUS avec InvoiceTypeCode 389 ou 261 et les profils NLCIUS habituels, envoyez vers POST /api/v1/{partyId}/salesInvoice/send avec un body XML et optionnellement X-EConnect-DocumentId. Pour BIS Self-Billing 3.0 avec le CustomizationID et ProfileID correspondants, utilisez POST /api/v1/{partyId}/generic/send ; la PSB reconnaît le profil à partir du document.

Comment sont structurés les rôles du fournisseur et de l'acheteur dans l'UBL ?

AccountingSupplierParty est toujours le fournisseur (en self-billing, la partie qui "reçoit" la facture), et AccountingCustomerParty est l'acheteur qui crée et envoie le document au nom du fournisseur. Cette inversion par rapport à une facture de vente classique est une erreur d'implémentation fréquente.

Comment éviter les envois self-billing en double et en cas de pièces jointes volumineuses ?

Utilisez les mêmes règles d'idempotency que pour les factures classiques : envoyez X-EConnect-DocumentId avec un UUID, pas le numéro de facture. Les payloads dépassant environ 24 MB (overhead inclus) sont rejetés par le serveur web ; réduisez les PDFs base64 intégrés ou fractionnez la livraison, en tenant compte d'environ 33% d'overhead lié au base64.


Vous souhaitez d'abord valider le document avant de l'envoyer ? Utilisez la Validate API pour vérifier votre facture self-billing sans l'envoyer réellement.

Essayer dans l'API