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)

Reaching Italy through Peppolโ€‹

What GoRoute does, and what it does not

GoRoute transmits over the Peppol network. It does not convert UBL to FatturaPA, and it does not transmit to SDI directly.

Italy is reachable over Peppol because SDI-accredited intermediaries perform that conversion at the Italian end. Your invoice travels as Peppol BIS 3.0 UBL, addressed to the Italian participant; the conversion to FatturaPA and the SDI submission happen after it leaves the network.

If your obligation is to file with SDI yourself, you need an SDI intermediary in addition to a Peppol access point. Talk to us before you plan an Italian rollout around this page.

Sending to an Italian recipientโ€‹

# Send a Peppol BIS 3.0 invoice to an Italian recipient over Peppol.
response = requests.post(
"https://app.goroute.ai/peppol-api/api/v1/documents",
headers={"X-API-Key": "your_api_key"},
json={
"sender_scheme": "9930", # German VAT
"sender_id": "DE123456789",
"receiver_scheme": "0211", # Italian Codice Fiscale
"receiver_id": "12345678901",
# The Codice Destinatario is carried inside the UBL document
# (cbc:EndpointID schemeID="0201"), not as a request field.
"document": invoice_xml # UBL XML string, not base64
}
)

Receiving from Italyโ€‹

Invoices from Italy are converted from FatturaPA to UBL before they reach you.

Register a webhook with POST /api/v1/webhooks to be notified when a document arrives, then read the stored document with GET /api/v1/transactions and GET /api/v1/transactions/{transaction_id}. See the API reference for the current webhook event payload rather than copying a fixed shape from this page.

Required Fieldsโ€‹

For Italian B2Bโ€‹

<Invoice>
<!-- Standard Peppol BIS 3.0 customization -->
<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.