Italy ๐ฎ๐น
SDI (Sistema di Interscambio) and FatturaPA requirements for Italy.
Overviewโ
| Aspect | Details |
|---|---|
| B2G Mandate | Required since 2014 (FatturaPA) |
| B2B Mandate | Required since 2019 |
| National Format | FatturaPA XML |
| Peppol Support | Available (PeppolโSDI interop) |
| Primary Scheme | 0211 (Codice Fiscale), 9906 (Partita IVA) |
| Exchange System | SDI (Sistema di Interscambio) |
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โ
| Code | Description |
|---|---|
| FPA12 | B2G (Pubblica Amministrazione) |
| FPR12 | B2B/B2C (Privati) |
Reaching Italy through Peppolโ
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:
| Code | Description |
|---|---|
| RF01 | Ordinario |
| RF02 | Contribuenti minimi |
| RF04 | Agricoltura |
| RF05 | Pesca |
| RF19 | Forfettario |
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โ
| Code | Rate | Description |
|---|---|---|
| S | 22% | Standard rate |
| AA | 10% | Reduced |
| H | 5% | Super-reduced |
| I | 4% | Minimum |
| Z | 0% | Zero rate |
| E | 0% | Exempt |
| N1-N7 | - | Exclusion codes |
Natura (Exclusion Codes)โ
Italian invoices use specific codes for non-taxable transactions:
| Code | Description |
|---|---|
| N1 | Escluse art. 15 |
| N2 | Non soggette |
| N3 | Non imponibili |
| N4 | Esenti |
| N5 | Regime del margine |
| N6 | Reverse charge |
| N7 | IVA 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โ
- Italy overview โ FatturaPA and SDI
- 2026 e-invoicing mandate tracker โ every country, one page
- How to choose a Peppol Access Point
- One API for multi-country e-invoicing
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.