In Italy, fiskaly supports sending B2B and B2C e-invoices, and receiving B2B e-invoices. We currently support the Standard Invoice (Fattura, TD01). Support for the Simplified Invoice (Fattura semplificata, TD07) is coming soon.
E-invoicing is mandatory and regulated by the Agenzia delle Entrate (Revenue Agency). Both B2B and B2C invoices must be exchanged via SDI (Sistema di Interscambio — Exchange System) in the FatturaPA (Electronic Invoice) XML format and have been legally required since January 2019. Invoices must also be preserved long-term through certified archiving (conservazione a norma).
This page covers the Italy-specific requirements that complement the General Step-by-Step Integration, for onboarding a Taxpayer for e-invoicing.
fiskaly handles both directions of the SDI exchange, and the two work differently:
Sending — B2B and B2C
fiskaly generates the FatturaPA and submits it to SDI, which validates and forwards it to the recipient asynchronously. No network registration is required. Business and consumer recipients each take different fields.
Receiving — B2B only
Optional, and enabled per Taxpayer. Requires a one-time registration to receive invoices from your suppliers.
On top of both directions, every invoice you send and receive is automatically archived for you. This means certified long-term preservation (conservazione a norma) for the legally required 10 years, with no setup on your side.
If you already have a SIGN IT integration, you don’t start from scratch — you extend your existing Taxpayer with the additional registration data and commission an E_INVOICE_SERVICE System. See E-INVOICE IT for SIGN IT customers for the full steps.
Prerequisites
Section titled “Prerequisites”These apply to any Taxpayer you onboard for e-invoicing in Italy — whether you send, receive, or both. Make sure you have the following Taxpayer information ready before proceeding.
E-INVOICE IT currently supports Taxpayers of type COMPANY. Onboarding an INDIVIDUAL Taxpayer — a freelancer or sole trader issuing under their own codice fiscale rather than a company VAT ID — is coming soon.
Italy-specific registration data — submitted under content.fiscalization.registration:
company_id— Numero Registro Imprese (Business Register number)office— province code of the Camera di Commercio that issued the REA number, e.g.MI,RMentry— REA number (6 or 7 digits)legal_form— legal form of the entity (e.g.LIMITED_LIABILITY_COMPANY,JOINT_STOCK_COMPANY)capital— registered share capital in EUR (e.g."10000.00")shareholder_status—SOLE_SHAREHOLDERorMULTIPLE_SHAREHOLDERSliquidation_status—IN_LIQUIDATIONorNOT_IN_LIQUIDATIONtax_regime— optional,ORDINARY(default) orFLAT_RATE_SCHEME(Regime Forfettario)
Standard Taxpayer fields — part of the Taxpayer itself (shared with SIGN IT if you use it):
content.name— registered legal name of the company or individualcontent.address— registered legal addresscontent.address.region— Provincia (Province code, e.g.MI,RM); required on the Taxpayer and validated at commissioning
For e-invoicing in Italy, content.address.region (Provincia) is a required field on the Taxpayer. It is validated when the E_INVOICE_SERVICE System is commissioned — if region is missing, commissioning fails. Make sure it is set or updated on the Taxpayer beforehand.
Sending e-invoices: recipient requirements
Section titled “Sending e-invoices: recipient requirements”To send an e-invoice, you specify its recipient and their routing details — right on the invoice record. When you create the invoice (TRANSACTION::INVOICE) with createRecord, add the recipient to its recipients array. Which fields you set depends on who you are invoicing:
Business recipients (B2B)
Routed by the recipient's SDI destination code, or by PEC if they have no SDI inbox.
Consumer recipients (B2C)
Italian residents are identified by codice fiscale; consumers abroad by a foreign identifier.
Every recipient carries invoicing.type = SDI. What changes between the three cases is the identification, the destination code, and whether a PEC is involved:
| Business | Consumer in Italy | Consumer abroad | |
|---|---|---|---|
type | BUSINESS | CONSUMER | CONSUMER |
identification | VAT — validated | TAX — codice fiscale, validated | any type; not validated |
invoicing.destination_code | the recipient’s 7-character code, or "0000000", or "XXXXXXX" | "0000000" | "XXXXXXX" |
invoicing.pec | required with "0000000" | optional | not used |
address.region | required when the address is in Italy | required | not required |
name | company name | gender, forename, surname | gender, forename, surname |
- The 7-character code the recipient gave you (e.g.
ABC1234) — uppercase letters and digits only. "0000000"— the recipient has no SDI inbox: every consumer, plus businesses that receive by PEC."XXXXXXX"— the recipient is abroad.
Business recipients (B2B)
Section titled “Business recipients (B2B)”Each business recipient is a BUSINESS with a populated invoicing block, as the General Step-by-Step Integration explains. Beyond the standard details every e-invoice requires (recipient name, address, tax identification, invoice lines, and so on), Italy adds the SDI routing fields above.
Which values destination_code and pec take depends on the recipient:
| Scenario | destination_code | pec |
|---|---|---|
| Recipient has a registered SDI inbox | their 7-character code (e.g. ABC1234) | optional |
| Recipient is not registered with SDI | "0000000" | required |
| Recipient is outside Italy | "XXXXXXX" | not used |
A pec is a Posta Elettronica Certificata address — Italy’s certified email. SDI checks the domain, so an ordinary mailbox is rejected.
"0000000" means deliver by PEC, which is why the pec is mandatory with it for a business recipient.
recipients[].address.region (the recipient’s Provincia) isn’t marked required in the shared Unified API schema, but Italy requires it whenever the address is in Italy. It is not checked when the record is created: createRecord returns successfully and the transmission fails later, taking the whole chain to FAILED. Set it up front rather than discovering it asynchronously.
Consumer recipients (B2C)
Section titled “Consumer recipients (B2C)”When your customer is a private individual rather than a business, set recipients[].type to CONSUMER. The invoice goes through SDI as a FatturaPA (TD01) document, like a B2B invoice.
Consumers have no SDI inbox, so routing works differently. How you identify the consumer depends on whether they are resident in Italy:
- Resident in Italy — identified by their codice fiscale, routed with destination code
"0000000". - Outside Italy — no codice fiscale exists, so a foreign identifier takes its place and the invoice is routed with
"XXXXXXX".
Beyond the fields in the table above, a consumer recipient always carries name.gender, name.forename, and name.surname, plus the consumer’s address.
Consumers resident in Italy
Section titled “Consumers resident in Italy”Send the codice fiscale as a TAX identification (16 characters), the residence address including region (Provincia), and destination code "0000000". A pec may be added but is not required.
For a consumer resident in Italy an identification is mandatory, it must be of type TAX, and the codice fiscale is checked when you create the record — a missing or malformed one is rejected there and no invoice is created. SDI validates it again against the tax registry, so a well-formed but unknown code is rejected at that stage.
Consumers outside Italy
Section titled “Consumers outside Italy”A consumer who isn’t resident in Italy has no codice fiscale, so send a foreign identifier in its place — typically a foreign tax or VAT number.
| Field | Value |
|---|---|
recipients[].identification | required; VAT, TAX, PASSPORT, DOCUMENT, or OTHER — whichever fits the identifier you hold |
recipients[].address.country | the consumer’s country as an ISO 3166-1 alpha-2 code |
recipients[].address.code | "00000" — FatturaPA only accepts a 5-digit postal code |
recipients[].invoicing.destination_code | "XXXXXXX" |
The identifier travels to SDI as the IdCodice; neither fiskaly nor SDI checks it for validity once the address country is not Italy. region is not required for a non-Italian address.
"XXXXXXX" tells SDI that clearance is requested but that delivery through the exchange system does not apply — SDI has no channel to reach a recipient abroad. Send the consumer their copy of the invoice (PDF or equivalent) separately, outside SDI.
gender is required by the Unified API, not by SDI — the FatturaPA invoice carries no such field. Send DIVERSE when you don’t have the data.
For a consumer resident in Italy, SDI files the original invoice in their reserved area on the AdE portal (Fatture e Corrispettivi).
When the customer needs an invoice instead of a receipt
Section titled “When the customer needs an invoice instead of a receipt”Italy reports the two documents through separate channels — the receipt through corrispettivi, the invoice through SDI — and nothing links them automatically.
Capture the request before the sale is closed. When the customer tells you they need a fattura, issue a TRANSACTION::INVOICE in place of a TRANSACTION::RECEIPT. Asking “do you need an invoice?” as part of checkout is the flow fiskaly supports end to end today, whether the customer asks before or during the sale.
We are building a supported path that links a fiscalized receipt and an e-invoice to one another, so that a single supply carries one invoice and one audit trail. Until it is available, capture the invoice request before the transaction is closed.
Handling SDI responses
Section titled “Handling SDI responses”Unlike a synchronous API call, the SDI outcome is asynchronous. After you create the invoice (TRANSACTION::INVOICE) with createRecord, poll or listen for updates on the E_INVOICE::TRANSMISSION Record to learn whether SDI accepted it.
SDI outcomes typically arrive within a few minutes, though the SDI specification allows up to 48 hours.
All three Records reach their final state together:
| Record | Final state |
|---|---|
E_INVOICE::TRANSMISSION | COMPLETED or FAILED, mode=FINISHED |
TRANSACTION::INVOICE | COMPLETED or FAILED, mode=FINISHED |
INTENTION::TRANSACTION | COMPLETED or FAILED, mode=FINISHED |
On failure, the SDI rejection reason is available in logs[].message on all three Records. For more details, see How to check the status of an e-invoice on our Support page.
Error stages
Section titled “Error stages”Errors can occur at three distinct stages, each with different behavior:
| Stage | When | Behavior |
|---|---|---|
| UAPI validation (synchronous) | Invalid payload | 4xx returned immediately — no Record is created. Fix the payload and retry on the same INTENTION::TRANSACTION. |
| Pre-SDI validation (asynchronous) | Invoice rejected before reaching SDI | Full chain reaches state=FAILED — a new chain is required to retry. |
| SDI rejection (asynchronous) | SDI returns NS | Full chain reaches state=FAILED — a new chain is required to retry. |
Failures and resubmission
Section titled “Failures and resubmission”If SDI returns NS (Notifica di Scarto), the invoice is legally non-existent:
- Read
logs[].messageon any of the three Records to get the SDI rejection reason. - Create a new
INTENTION::TRANSACTIONand a newTRANSACTION::INVOICEwith corrected data. - The same
document.numbermay be reused within 5 days of theNSrejection. - The failed chain remains
FAILEDpermanently — it is kept for audit purposes.
Each resubmission starts a fresh transaction chain — UAPI treats it as an entirely new submission.
Receiving e-invoices
Section titled “Receiving e-invoices”An E_INVOICE_SERVICE System can both send and receive e-invoices. Receiving is optional — a send-only Taxpayer can skip this section.
Two separate, independent things are involved:
- Readiness to receive — fiskaly sets this up automatically when you commission the System.
- SDI recipient-code registration (manual, done by you) — in your Agenzia delle Entrate (AdE) portal, set fiskaly’s SDI recipient code
JKKZDGRas your company’s SDI destination, so SDI routes your inbound invoices to fiskaly.
The commissioning response shows compliance.state as TRANSMISSION_ONLY. It then moves to TRANSMISSION_RECEPTION automatically once the Taxpayer’s registration completes — which it normally does, regardless of whether you’ve done the AdE registration or plan to receive.
TRANSMISSION_RECEPTION means the System is able to receive, but not that inbound invoices are actually being delivered to the Taxpayer. That delivery requires the AdE registration: until it is in place, the Taxpayer receives no invoices, even while the System is ready. You can complete the AdE registration at any time — for example, to enable receiving on a Taxpayer that was previously set up for sending only.
Call retrieveSystem at any time to read the current compliance.state, which reflects only readiness — not the AdE registration:
TRANSMISSION_RECEPTION— fiskaly has set the System up to receive.TRANSMISSION_ONLY— that setup hasn’t completed.
If retrieveSystem keeps returning compliance.state = TRANSMISSION_ONLY after commissioning, the Taxpayer’s registration didn’t complete. Treat it as a stuck transition and contact the fiskaly support team at dev-support@fiskaly.com with the Taxpayer’s VAT ID so we can investigate.
There is nothing extra to set up for routing: fiskaly automatically matches each incoming invoice to the right Taxpayer using its tax ID — which is also why each tax ID must belong to a single registered Taxpayer. You don’t need to configure or store a separate routing code.
When an invoice arrives
Section titled “When an invoice arrives”When an invoice is sent to you through SDI, fiskaly receives it automatically:
- the inbound delivery triggers a webhook
- a reception record is created for the invoice
- the signed XML, PDF, and metadata are stored against the record
- duplicate deliveries are deduplicated
In practice, the first invoice that reaches you this way is also your confirmation that receiving is set up correctly.
If you are integrating E-INVOICE IT without SIGN IT, please reach out to the fiskaly support team at dev-support@fiskaly.com — we will guide you through the Taxpayer setup for your specific case.
Archiving
Section titled “Archiving”Italian law requires e-invoices to be preserved long-term through certified digital archiving (conservazione a norma): they must be kept for at least 10 years and stored so they remain immutable, authentic, and easily retrievable, with digital signatures and timestamps (marca temporale). Keeping your own copy of the XML is not enough — fiskaly handles this for you.
For Italy, archiving is automatic and always on: every invoice you send and every invoice you receive through SDI is legally preserved, with no extra setup or API call on your side. It only relies on the Taxpayer’s Italian tax ID, which is already part of onboarding. Each preserved invoice gets a preservation receipt as proof of conservazione a norma. Preservation usually completes within seconds; the receipt itself can take a few minutes to be issued, after which fiskaly attaches it automatically — nothing is required on your side.
Retrieve an e-invoice’s artifacts from its record with retrieveRecord, selecting the artifact through a query parameter:
compliance-artifact— the legally authoritative document. For Italy, the SDI-validated FatturaPA XML.archive-artifact— the preservation receipt attesting legal preservation (conservazione a norma), available as a human-readable PDF and a signed XML for audit or legal use.
In the test environment archiving runs end to end, but the result has no legal validity — it is for integration testing only. Only invoices processed in live are certified as legally preserved.