Facture rectificative
La rectification d’une livraison de marchandises surfacturée : type de document 384, tous les montants négatifs, les prix unitaires positifs. Construite étape par étape, en gardant un œil sur les endroits où une rectification diffère d’un avoir.
La base est la facture d’exemple officielle
X14_01_Rechnungskorrektur issue de la documentation
Factur-X / ZUGFeRD (jeu d’exemples FeRD, ZUGFeRD 2.5.0, profil
EXTENDED). Le code ci-dessous produit exactement ce document, champ par
champ et dans le même ordre.
Rectification ou avoir ?
C’est la question qui prend le plus de temps, et elle décide de chaque signe dans le document. Les deux types de document réduisent une créance, mais ils le font de manière opposée :
| Facture rectificative (384) | Avoir (381) | |
|---|---|---|
| FactoorSharp | InvoiceType.Correction |
InvoiceType.CreditNote |
| Quantités (BT-129) | négatives | positives |
| Prix unitaires (BT-146 / BT-148) | positifs | positifs |
| Totaux, taxes, remises | négatifs | positifs |
| Lecture | Le document rectifie la facture d’origine d’un montant de différence. | Le document reflète la facture d’origine dans son ensemble. |
Le signe appartient à la quantité, pas au prix. Un prix unitaire négatif associé à une quantité positive donne arithmétiquement le même total de ligne, mais c’est incorrect sur le plan métier et de nombreux destinataires le remarqueront. La référence procède dans l’autre sens, et cette page aussi.
Les sections ci-dessous s’enchaînent et appartiennent à un seul programme. Si vous ne connaissez pas encore FactoorSharp, commencez plutôt par Pour commencer – ici l’accent est mis sur ce qui rend la rectification particulière. Pour chaque numéro BT et BG, vous trouverez l’élément XML correspondant dans la référence Factur-X.
1. En-tête de facture
Outre le numéro, la date et la devise, deux éléments ressortent : le type de document et le processus métier (BT-23), que cet exemple renseigne contrairement à la facture de marchandises.
FacturXInvoice invoice = FacturXInvoice.CreateInvoice(
invoiceNo: "RK21012345",
invoiceDate: new DateTime(2025, 10, 1),
currency: CurrencyCodes.EUR);
// BT-3 : 384 = facture rectificative. La différence décisive avec 381 (avoir).
invoice.Type = InvoiceType.Correction;
invoice.Name = "RECHNUNGS-KORREKTUR"; // BT-X-2, EXTENDED uniquement
invoice.IsTest = true; // ram:TestIndicator, EXTENDED uniquement
// BT-23 : processus métier → ram:BusinessProcessSpecifiedDocumentContextParameter
invoice.BusinessProcess = "Beispielgeschäftsprozess";
Dim invoice As FacturXInvoice = FacturXInvoice.CreateInvoice(
invoiceNo:="RK21012345",
invoiceDate:=New DateTime(2025, 10, 1),
currency:=CurrencyCodes.EUR)
' BT-3 : 384 = facture rectificative. La différence décisive avec 381 (avoir).
invoice.Type = InvoiceType.Correction
invoice.Name = "RECHNUNGS-KORREKTUR" ' BT-X-2, EXTENDED uniquement
invoice.IsTest = True ' ram:TestIndicator, EXTENDED uniquement
' BT-23 : processus métier → ram:BusinessProcessSpecifiedDocumentContextParameter
invoice.BusinessProcess = "Beispielgeschäftsprozess"
2. Notes en texte libre
Les mêmes types de note que dans la facture de marchandises, mais dans un ordre
différent : ici la note AAK avec son code de contenu vient en
premier. Comme le contrôle croisé avec la référence compare aussi l’ordre,
ce n’est pas un détail mais une exigence.
// Dans cette référence, la note AAK avec son code de contenu vient en premier.
invoice.AddNote("Es bestehen Rabatt- oder Bonusvereinbarungen.",
subjectCode: SubjectCodes.AAK,
contentCode: ContentCodes.ST3);
invoice.AddNote("Geschäftsführer: Herr Geschäftsführer , Muster Maschinenbau GmbH etc. ",
subjectCode: SubjectCodes.REG);
invoice.AddNote("Es bestehen Vereinbarungen, aus denen sich Minderungen des Entgelts ergeben können.",
subjectCode: SubjectCodes.AAI);
invoice.AddNote("ZUGFeRD vers 2.5.0 (Extended)", subjectCode: SubjectCodes.ACB);
invoice.AddNote("Dies ist eine Beispiel-für eine Korrektur einer Rechnung (Type 384)",
subjectCode: SubjectCodes.ACB);
' Dans cette référence, la note AAK avec son code de contenu vient en premier.
invoice.AddNote("Es bestehen Rabatt- oder Bonusvereinbarungen.",
subjectCode:=SubjectCodes.AAK,
contentCode:=ContentCodes.ST3)
invoice.AddNote("Geschäftsführer: Herr Geschäftsführer , Muster Maschinenbau GmbH etc. ",
subjectCode:=SubjectCodes.REG)
invoice.AddNote("Es bestehen Vereinbarungen, aus denen sich Minderungen des Entgelts ergeben können.",
subjectCode:=SubjectCodes.AAI)
invoice.AddNote("ZUGFeRD vers 2.5.0 (Extended)", subjectCode:=SubjectCodes.ACB)
invoice.AddNote("Dies ist eine Beispiel-für eine Korrektur einer Rechnung (Type 384)",
subjectCode:=SubjectCodes.ACB)
Les textes des notes, les noms de produits et les motifs de remise restent en allemand sur toute cette page : ce sont les données de la facture de référence officielle, et les traduire romprait la comparaison avec elle.
3. Vendeur et acheteur
Inchangés par rapport à une facture normale – une rectification n’inverse pas les rôles. Le vendeur reste le vendeur, même quand l’argent repart dans l’autre sens.
// Vendeur (BG-4). Contrairement à la facture de marchandises, sans adresse
// électronique – la référence n'émet pas de ram:URIUniversalCommunication, donc pas
// de SetSellerElectronicAddress() non plus.
invoice.SetSeller(
name: "MUSTERLIEFERANT GMBH",
postcode: "98765",
city: "MUSTERHAUSEN",
street: "BAHNHOFSTRASSE 99",
country: CountryCodes.DE,
id: "549910",
globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4333741000005"));
invoice.SetSellerContact(
emailAddress: "max.mustermann@musterlieferant.de",
phoneno: "+49 932 431 500");
invoice.AddSellerTaxRegistration("DE123456788", TaxRegistrationSchemeID.VA);
// Acheteur (BG-7)
invoice.SetBuyer(
name: "MUSTER-KUNDE GMBH",
postcode: "12345",
city: "KUNDENDORF",
street: "KUNDENWEG 88",
country: CountryCodes.DE,
id: "009420",
globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"));
' Vendeur (BG-4). Contrairement à la facture de marchandises, sans adresse
' électronique – la référence n'émet pas de ram:URIUniversalCommunication, donc pas
' de SetSellerElectronicAddress() non plus.
invoice.SetSeller(
name:="MUSTERLIEFERANT GMBH",
postcode:="98765",
city:="MUSTERHAUSEN",
street:="BAHNHOFSTRASSE 99",
country:=CountryCodes.DE,
id:="549910",
globalID:=New GlobalID(GlobalIDSchemeIdentifiers.GLN, "4333741000005"))
invoice.SetSellerContact(
emailAddress:="max.mustermann@musterlieferant.de",
phoneno:="+49 932 431 500")
invoice.AddSellerTaxRegistration("DE123456788", TaxRegistrationSchemeID.VA)
' Acheteur (BG-7)
invoice.SetBuyer(
name:="MUSTER-KUNDE GMBH",
postcode:="12345",
city:="KUNDENDORF",
street:="KUNDENWEG 88",
country:=CountryCodes.DE,
id:="009420",
globalID:=New GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"))
4. Références de documents
C’est ici que l’on voit à quoi se rapporte la rectification. Deux références de documents supplémentaires (BT-18 / BG-24) portant le code de type 130 contiennent le dossier de réclamation et le numéro de la facture d’origine.
invoice.SetBuyerOrderReferenceDocument("B123456789"); // BT-13
// Deux références de documents supplémentaires avec le code de type 130 : l'une pour
// le dossier de réclamation, l'autre pour la facture d'origine qui est rectifiée.
// L'ordre des appels détermine l'ordre dans le XML.
invoice.AddAdditionalReferencedDocument(
id: "REKLA-2018-235",
typeCode: AdditionalReferencedDocumentTypeCode.InvoiceDataSheet);
invoice.AddAdditionalReferencedDocument(
id: "R87654321012345",
typeCode: AdditionalReferencedDocumentTypeCode.InvoiceDataSheet);
invoice.SetDeliveryNoteReferenceDocument("L87654321012345"); // BT-16
invoice.ActualDeliveryDate = new DateTime(2025, 10, 1); // BT-72
invoice.SetBuyerOrderReferenceDocument("B123456789") ' BT-13
' Deux références de documents supplémentaires avec le code de type 130 : l'une pour
' le dossier de réclamation, l'autre pour la facture d'origine qui est rectifiée.
' L'ordre des appels détermine l'ordre dans le XML.
invoice.AddAdditionalReferencedDocument(
id:="REKLA-2018-235",
typeCode:=AdditionalReferencedDocumentTypeCode.InvoiceDataSheet)
invoice.AddAdditionalReferencedDocument(
id:="R87654321012345",
typeCode:=AdditionalReferencedDocumentTypeCode.InvoiceDataSheet)
invoice.SetDeliveryNoteReferenceDocument("L87654321012345") ' BT-16
invoice.ActualDeliveryDate = New DateTime(2025, 10, 1) ' BT-72
Pour le renvoi à la facture rectifiée, il existe aussi un élément
spécialisé, ram:InvoiceReferencedDocument (BT-25/BT-26). La
référence FeRD ne l’utilise pas ici, il n’apparaît donc pas non
plus dans ce code – mais si vous n’êtes pas tenu de suivre le
modèle, c’est l’option la plus précise.
5. Destinataire des marchandises et de la facture
Les destinataires divergents restent exactement tels qu’ils figuraient sur la facture d’origine.
// Destinataire des marchandises (BG-13)
invoice.ShipTo = new Party()
{
GlobalID = new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171088093"),
Name = "MUSTER-MARKT",
Postcode = "54321",
Street = "HAUPTSTRASSE 44",
City = "LIEFERSTADT",
Country = CountryCodes.DE
};
// ram:DefinedTradeContact/ram:DepartmentName – OrgUnit correspond exactement à ce champ.
invoice.ShipToContact = new Contact() { OrgUnit = "8211" };
// Destinataire de la facture (BG-X-36, EXTENDED uniquement)
invoice.Invoicee = new Party()
{
ID = new GlobalID(null, "009420"),
GlobalID = new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"),
Name = "MUSTER-KUNDE GMBH",
Postcode = "123456",
Street = "KUNDENWEG 88",
City = "KUNDENDORF",
Country = CountryCodes.DE
};
' Destinataire des marchandises (BG-13)
invoice.ShipTo = New Party() With
{
.GlobalID = New GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171088093"),
.Name = "MUSTER-MARKT",
.Postcode = "54321",
.Street = "HAUPTSTRASSE 44",
.City = "LIEFERSTADT",
.Country = CountryCodes.DE
}
' ram:DefinedTradeContact/ram:DepartmentName – OrgUnit correspond exactement à ce champ.
invoice.ShipToContact = New Contact() With {.OrgUnit = "8211"}
' Destinataire de la facture (BG-X-36, EXTENDED uniquement)
invoice.Invoicee = New Party() With
{
.ID = New GlobalID(Nothing, "009420"),
.GlobalID = New GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"),
.Name = "MUSTER-KUNDE GMBH",
.Postcode = "123456",
.Street = "KUNDENWEG 88",
.City = "KUNDENDORF",
.Country = CountryCodes.DE
}
6. Lignes de facture
C’est ici que se trouve la rectification proprement dite : cinq bouteilles et deux paquets repartent. Les prix unitaires restent positifs, les quantités deviennent négatives, et cela produit les totaux de ligne négatifs.
Les remises sur article de la facture d’origine (BT-147) restent elles aussi positives. Elles font partie du prix, ce ne sont pas des montants portés sur la facture : 1,50 − 0,03 − 0,02 = 1,45, et seule la quantité négative inverse le résultat.
// Ligne 1 : 5 bouteilles d'acide citrique retournées → −5 × 1,00 = −5,00, 19 %.
TradeLineItem line1 = invoice.AddTradeLineItem(
lineID: "1",
name: "Zitronensäure 100ml",
netUnitPrice: 1.00m, // positif !
grossUnitPrice: 1.00m, // positif !
unitCode: QuantityCodes.H87,
billedQuantity: -5m, // négatif !
lineTotalAmount: -5.00m,
taxType: TaxTypes.VAT,
categoryCode: TaxCategoryCodes.S,
taxPercent: 19m,
sellerAssignedID: "ZS997",
id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000014"));
line1.PackageQuantity = 1m;
line1.PackageUnitCode = QuantityCodes.XBO; // XBO = bouteille
// Ligne 2 : 2 paquets de sucre gélifiant retournés. Les remises sur article de la
// facture d'origine restent applicables et restent POSITIVES – elles font partie du
// prix, ce ne sont pas des montants : 1,50 − 0,03 − 0,02 = 1,45 ; −2 × 1,45 = −2,90, 7 %.
TradeLineItem line2 = invoice.AddTradeLineItem(
lineID: "2",
name: "Gelierzucker Extra 250g",
netUnitPrice: 1.45m,
grossUnitPrice: 1.50m,
unitCode: QuantityCodes.H87,
billedQuantity: -2m,
lineTotalAmount: -2.90m,
taxType: TaxTypes.VAT,
categoryCode: TaxCategoryCodes.S,
taxPercent: 7m,
sellerAssignedID: "GZ250",
id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000021"));
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount: null, actualAmount: 0.03m, reason: "Artikelrabatt 1");
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount: null, actualAmount: 0.02m, reason: "Artikelrabatt 2");
line2.PackageQuantity = 1m;
line2.PackageUnitCode = QuantityCodes.XCT; // XCT = carton
' Ligne 1 : 5 bouteilles d'acide citrique retournées → −5 × 1,00 = −5,00, 19 %.
Dim line1 As TradeLineItem = invoice.AddTradeLineItem(
lineID:="1",
name:="Zitronensäure 100ml",
netUnitPrice:=1.0D, ' positif !
grossUnitPrice:=1.0D, ' positif !
unitCode:=QuantityCodes.H87,
billedQuantity:=-5D, ' négatif !
lineTotalAmount:=-5.0D,
taxType:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
taxPercent:=19D,
sellerAssignedID:="ZS997",
id:=New GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000014"))
line1.PackageQuantity = 1D
line1.PackageUnitCode = QuantityCodes.XBO ' XBO = bouteille
' Ligne 2 : 2 paquets de sucre gélifiant retournés. Les remises sur article de la
' facture d'origine restent applicables et restent POSITIVES – elles font partie du
' prix, ce ne sont pas des montants : 1,50 − 0,03 − 0,02 = 1,45 ; −2 × 1,45 = −2,90, 7 %.
Dim line2 As TradeLineItem = invoice.AddTradeLineItem(
lineID:="2",
name:="Gelierzucker Extra 250g",
netUnitPrice:=1.45D,
grossUnitPrice:=1.5D,
unitCode:=QuantityCodes.H87,
billedQuantity:=-2D,
lineTotalAmount:=-2.9D,
taxType:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
taxPercent:=7D,
sellerAssignedID:="GZ250",
id:=New GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000021"))
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount:=Nothing, actualAmount:=0.03D, reason:="Artikelrabatt 1")
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount:=Nothing, actualAmount:=0.02D, reason:="Artikelrabatt 2")
line2.PackageQuantity = 1D
line2.PackageUnitCode = QuantityCodes.XCT ' XCT = carton
7. Remises au niveau du document
Les remises s’inversent avec le reste : une remise sur une contre-passation est une reprise, la base de calcul et le montant sont donc négatifs. Comme dans toute facture à taux de TVA mixtes, chaque remise a besoin de sa propre entrée par taux – deux remises donnent quatre appels.
// Remise sur facture 1 – en pourcentage, 2 %.
invoice.AddTradeAllowance(
basisAmount: -5.00m,
currency: CurrencyCodes.EUR,
actualAmount: -0.10m,
chargePercentage: 2.00m,
reason: "Rechnungsrabatt 1",
taxTypeCode: TaxTypes.VAT,
taxCategoryCode: TaxCategoryCodes.S,
taxPercent: 19m);
invoice.AddTradeAllowance(
basisAmount: -2.90m,
currency: CurrencyCodes.EUR,
actualAmount: -0.06m,
chargePercentage: 2.00m,
reason: "Rechnungsrabatt 1",
taxTypeCode: TaxTypes.VAT,
taxCategoryCode: TaxCategoryCodes.S,
taxPercent: 7m);
// Remise sur facture 2 – montant fixe, donc sans chargePercentage.
invoice.AddTradeAllowance(
basisAmount: -5.00m,
currency: CurrencyCodes.EUR,
actualAmount: -0.05m,
reason: "Rechnungsrabatt 2",
taxTypeCode: TaxTypes.VAT,
taxCategoryCode: TaxCategoryCodes.S,
taxPercent: 19m);
invoice.AddTradeAllowance(
basisAmount: -2.90m,
currency: CurrencyCodes.EUR,
actualAmount: -0.02m,
reason: "Rechnungsrabatt 2",
taxTypeCode: TaxTypes.VAT,
taxCategoryCode: TaxCategoryCodes.S,
taxPercent: 7m);
' Remise sur facture 1 – en pourcentage, 2 %.
invoice.AddTradeAllowance(
basisAmount:=-5D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.1D,
chargePercentage:=2D,
reason:="Rechnungsrabatt 1",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=19D)
invoice.AddTradeAllowance(
basisAmount:=-2.9D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.06D,
chargePercentage:=2D,
reason:="Rechnungsrabatt 1",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=7D)
' Remise sur facture 2 – montant fixe, donc sans chargePercentage.
invoice.AddTradeAllowance(
basisAmount:=-5D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.05D,
reason:="Rechnungsrabatt 2",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=19D)
invoice.AddTradeAllowance(
basisAmount:=-2.9D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.02D,
reason:="Rechnungsrabatt 2",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=7D)
8. Ventilation de la TVA
Le calcul est le même que dans n’importe quelle facture, seulement avec les
signes inversés. Le point qui fait trébucher : une remise négative
augmente à nouveau la base d’imposition, c’est pourquoi
allowanceChargeBasisAmount est ici positif.
| Champ | 19 % (ligne 1) | 7 % (ligne 2) |
|---|---|---|
lineTotalBasisAmount |
−5,00 | −2,90 |
allowanceChargeBasisAmount |
−(−0,10) − (−0,05) = +0,15 | −(−0,06) − (−0,02) = +0,08 |
basisAmount |
−5,00 + 0,15 = −4,85 | −2,90 + 0,08 = −2,82 |
taxAmount |
−4,85 × 19 % = −0,9215 → −0,92 | −2,82 × 7 % = −0,1974 → −0,20 |
invoice.AddApplicableTradeTax(
basisAmount: -4.85m,
percent: 19m,
taxAmount: -0.92m,
typeCode: TaxTypes.VAT,
categoryCode: TaxCategoryCodes.S,
allowanceChargeBasisAmount: 0.15m, // positif, car les remises sont négatives
lineTotalBasisAmount: -5.00m);
invoice.AddApplicableTradeTax(
basisAmount: -2.82m,
percent: 7m,
taxAmount: -0.20m,
typeCode: TaxTypes.VAT,
categoryCode: TaxCategoryCodes.S,
allowanceChargeBasisAmount: 0.08m,
lineTotalBasisAmount: -2.90m);
invoice.AddApplicableTradeTax(
basisAmount:=-4.85D,
percent:=19D,
taxAmount:=-0.92D,
typeCode:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
allowanceChargeBasisAmount:=0.15D, ' positif, car les remises sont négatives
lineTotalBasisAmount:=-5D)
invoice.AddApplicableTradeTax(
basisAmount:=-2.82D,
percent:=7D,
taxAmount:=-0.2D,
typeCode:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
allowanceChargeBasisAmount:=0.08D,
lineTotalBasisAmount:=-2.9D)
9. Totaux du document
À la fin, le montant à payer est négatif – c’est la signature d’une rectification, et pour le destinataire l’indication que l’argent lui revient.
| Code BT | Paramètre | Calcul |
|---|---|---|
| BT-106 | lineTotalAmount |
−5,00 + (−2,90) = −7,90 |
| BT-107 | allowanceTotalAmount |
−0,10 − 0,06 − 0,05 − 0,02 = −0,23 |
| BT-109 | taxBasisAmount |
−7,90 − (−0,23) = −7,67 |
| BT-110 | taxTotalAmount |
−0,92 + (−0,20) = −1,12 |
| BT-112 | grandTotalAmount |
−7,67 + (−1,12) = −8,79 |
| BT-115 | duePayableAmount |
−8,79 – le montant revient au client |
invoice.SetTotals(
lineTotalAmount: -7.90m, // BT-106
chargeTotalAmount: 0.00m, // BT-108
allowanceTotalAmount: -0.23m, // BT-107
taxBasisAmount: -7.67m, // BT-109
taxTotalAmount: -1.12m, // BT-110
grandTotalAmount: -8.79m, // BT-112
totalPrepaidAmount: 0.00m, // BT-113
duePayableAmount: -8.79m); // BT-115 – le montant revient au client
invoice.SetTotals(
lineTotalAmount:=-7.9D, ' BT-106
chargeTotalAmount:=0D, ' BT-108
allowanceTotalAmount:=-0.23D, ' BT-107
taxBasisAmount:=-7.67D, ' BT-109
taxTotalAmount:=-1.12D, ' BT-110
grandTotalAmount:=-8.79D, ' BT-112
totalPrepaidAmount:=0D, ' BT-113
duePayableAmount:=-8.79D) ' BT-115 – le montant revient au client
10. Enregistrement et contrôle
L’enregistrement fonctionne comme pour tout document EXTENDED – version, profil et syntaxe vont ensemble :
invoice.Save("X14_01_Rechnungskorrektur.xml",
ZUGFeRDVersion.Version25,
Profile.Extended,
ZUGFeRDFormats.CII);
invoice.Save("X14_01_Rechnungskorrektur.xml",
ZUGFeRDVersion.Version25,
Profile.Extended,
ZUGFeRDFormats.CII)
Le résultat doit présenter la même structure arborescente que
X14_01_Rechnungskorrektur.xml du jeu d’exemples FeRD.
Quant à savoir si le document respecte également le jeu de règles, c’est le validateur qui répond – dans le navigateur ou directement depuis votre code. Une version lisible par un humain est produite par le visualiseur. Les deux, ainsi que leur documentation détaillée, se trouvent dans l’ espace client ; comment y accéder est expliqué sous Pour commencer.