Skip to main content

Italy ๐Ÿ‡ฎ๐Ÿ‡น

SDI (Sistema di Interscambio) and FatturaPA requirements for Italy.

Overviewโ€‹

AspectDetails
B2G MandateRequired since 2014 (FatturaPA)
B2B MandateRequired since 2019
National FormatFatturaPA XML
Peppol SupportAvailable (Peppolโ†”SDI interop)
Primary Scheme0211 (Codice Fiscale), 9906 (Partita IVA)
Exchange SystemSDI (Sistema di Interscambio)
Unique Italian Requirements

Italy has a mandatory national e-invoicing system (SDI) since 2019 for all B2B transactions. Peppol invoices must be converted to/from FatturaPA format.

How Italy Worksโ€‹

SDI Systemโ€‹

All Italian invoices flow through SDI:

Supplier โ†’ SDI โ†’ Receiver

For cross-border via Peppol:

Foreign Supplier โ†’ Peppol โ†’ SDI โ†’ Italian Receiver
Italian Supplier โ†’ SDI โ†’ Peppol โ†’ Foreign Receiver

Codice Destinatarioโ€‹

Every Italian recipient has a 7-character routing code:

# Examples of Codice Destinatario
routing_codes = {
"0000000": "Private individual (PEC used instead)",
"XXXXXXX": "SDI-registered business",
"AAAAAAA": "Government entity (FatturaPA)"
}

Identifier Schemesโ€‹

Codice Fiscale (0211)โ€‹

The Italian fiscal code (16 chars for individuals, 11 for companies):

# For companies: 11 digits
participant = {
"scheme": "0211",
"identifier": "12345678901",
"name": "Esempio SRL",
"country": "IT"
}

# For individuals: 16 alphanumeric
individual = {
"scheme": "0211",
"identifier": "RSSMRA80A01H501U",
"country": "IT"
}

Partita IVA (9906)โ€‹

VAT number, 11 digits:

participant = {
"scheme": "9906",
"identifier": "IT12345678901",
"name": "Esempio SpA",
"country": "IT"
}

Codice Destinatario (0201)โ€‹

The 7-character SDI routing code:

participant = {
"scheme": "0201",
"identifier": "W7YVJK9", # 7 chars
"name": "Esempio SRL",
"country": "IT"
}

FatturaPA Formatโ€‹

Structureโ€‹

Italian invoices use FatturaPA XML format:

<FatturaElettronica versione="FPR12">
<FatturaElettronicaHeader>
<DatiTrasmissione>
<IdTrasmittente>
<IdPaese>IT</IdPaese>
<IdCodice>01234567890</IdCodice>
</IdTrasmittente>
<ProgressivoInvio>00001</ProgressivoInvio>
<FormatoTrasmissione>FPR12</FormatoTrasmissione>
<CodiceDestinatario>W7YVJK9</CodiceDestinatario>
</DatiTrasmissione>
<!-- ... -->
</FatturaElettronicaHeader>
</FatturaElettronica>

Format Versionsโ€‹

CodeDescription
FPA12B2G (Pubblica Amministrazione)
FPR12B2B/B2C (Privati)

Peppol to SDI Conversionโ€‹

GoRoute handles automatic conversion:

Sending to Italyโ€‹

# Send Peppol BIS 3.0 invoice to Italian recipient
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/documents",
headers={
"X-API-Key": "your_api_key",
"Content-Type": "application/json"
},
json={
"sender_scheme": "9930", # German VAT
"sender_id": "DE123456789",
"receiver_scheme": "0211", # Italian Codice Fiscale
"receiver_id": "12345678901",
"document": invoice_xml
}
)

The request body is flat - there are no nested sender or receiver objects - and document is the UBL XML as a plain string, not base64. A successful send returns 202 Accepted.

The send request has no routing-code field: the Codice Destinatario is not something the API accepts as a request parameter, and an earlier revision of this sample showed one inside a receiver object that the endpoint does not accept.

Receiving from Italyโ€‹

Invoices from Italy are converted from FatturaPA to UBL:

# Webhook receives UBL-converted invoice
{
"event": "document.received",
"original_format": "FatturaPA",
"converted_format": "UBL",
"sender": {
"scheme": "0211",
"identifier": "12345678901"
}
}

Required Fieldsโ€‹

For Italian B2Bโ€‹

<Invoice>
<!-- Standard Peppol - GoRoute converts to FatturaPA -->
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>

<!-- Italian supplier -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0211">12345678901</cbc:EndpointID>

<!-- Regime fiscale required for Italy -->
<cac:PartyTaxScheme>
<cbc:CompanyID>IT12345678901</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Italian buyer with Codice Destinatario -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0201">W7YVJK9</cbc:EndpointID>

<cac:PartyTaxScheme>
<cbc:CompanyID>IT98765432101</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingCustomerParty>
</Invoice>

Regime Fiscaleโ€‹

Italian suppliers must specify their tax regime:

CodeDescription
RF01Ordinario
RF02Contribuenti minimi
RF04Agricoltura
RF05Pesca
RF19Forfettario

VAT Requirementsโ€‹

Italian VAT Formatโ€‹

# Italian VAT: IT + 11 digits
def validate_italian_vat(vat: str) -> bool:
if not vat.startswith("IT"):
return False
number = vat[2:]
if len(number) != 11 or not number.isdigit():
return False
# Luhn check digit
return luhn_validate(number)

VAT Ratesโ€‹

CodeRateDescription
S22%Standard rate
AA10%Reduced
H5%Super-reduced
I4%Minimum
Z0%Zero rate
E0%Exempt
N1-N7-Exclusion codes

Natura (Exclusion Codes)โ€‹

Italian invoices use specific codes for non-taxable transactions:

CodeDescription
N1Escluse art. 15
N2Non soggette
N3Non imponibili
N4Esenti
N5Regime del margine
N6Reverse charge
N7IVA assolta in altro stato

Example Invoice to Italyโ€‹

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">

<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>

<cbc:ID>IT-FATT-2024-00123</cbc:ID>
<cbc:IssueDate>2024-01-15</cbc:IssueDate>
<cbc:DueDate>2024-02-15</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

<!-- Foreign Seller -->
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="9930">DE123456789</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>German Company GmbH</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>MusterstraรŸe 1</cbc:StreetName>
<cbc:CityName>Berlin</cbc:CityName>
<cbc:PostalZone>10115</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>DE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>DE123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>German Company GmbH</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>

<!-- Italian Buyer -->
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0201">W7YVJK9</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Esempio S.r.l.</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Via Roma 1</cbc:StreetName>
<cbc:CityName>Milano</cbc:CityName>
<cbc:PostalZone>20100</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>IT</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>IT12345678901</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Esempio S.r.l.</cbc:RegistrationName>
<cbc:CompanyID schemeID="0211">12345678901</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>

<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">22.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">100.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">22.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>22</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>

<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">100.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">122.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">122.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">100.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consulting Services</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>22</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">10.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>

Looking Up Italian Recipientsโ€‹

Use the standard participant lookup with Italy's VAT scheme (0211):

response = requests.get(
"https://app.goroute.ai/peppol-api/api/v1/participants/lookup",
params={"peppol_id": "0211:IT12345678901"},
headers={"X-API-Key": "your_api_key"}
)

# Returns:
{
"found": true,
"participant_id": "0211:IT12345678901",
"name": "Esempio S.p.A.",
"country": "IT",
"capabilities": [
"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##..."
]
}

Note: the Codice Destinatario and PEC address belong to Italy's SDI channel, not the Peppol network, so a Peppol lookup does not return them. When routing via SDI instead of Peppol, obtain the Codice Destinatario from your customer directly.

Resourcesโ€‹

Next Stepsโ€‹

Further readingโ€‹

Ready to build? The free developer sandbox gives you test credentials and a registered participant, provisioned within 24 hours on business days. Recorded ERP integration walkthroughs are on the tutorials page.