You are viewing the documentation for API version 2026-06-01.
This guide is for customers who already have a working SIGN IT integration and want to add Italian e-invoicing (E-INVOICE IT) — B2B and B2C — on top of it. Both products run on the same Unified API and share the same Taxpayer and Location structure — only a few additions are needed.
Coming from SIGN IT 2024-10-31 or 2025-08-12? Expand and read this first.
After version 2025-08-12, some resources were renamed and new ones were added for e-invoicing. The updated endpoints can be called with the same {id} already in use.
| Until version 2025-08-12 | After version 2025-08-12 | Notes |
|---|---|---|
ASSET — /assets | ORGANIZATION — /organizations | Just a rename — same ID as before. |
ENTITY (COMPANY/INDIVIDUAL) — /entities | TAXPAYER (COMPANY/INDIVIDUAL) — /taxpayers | Just a rename — same ID as before. |
ENTITY (LOCATION) — /entities | LOCATION — /locations | This resource is now split into two types:
|
SYSTEM referencing entity: {id} | SYSTEM referencing location: {id} | Just a rename — same ID as before. |
Before you continue:
- Update your
X-Api-Versionheader to the version shown in the banner above. - Make sure you’re pointing to the correct base URLs:
test.api.fiskaly.com(TEST) andlive.api.fiskaly.com(LIVE). - Add
fiscalization.credentials.tax_id_numberto your FISCONLINE credentials, if it isn’t already there. This field wasn’t required in 2024-10-31, was optional in 2025-08-12, but is now required. - Review the key record payload structure updates in the API doc — this FAQ may help along the way. For any questions, feel free to contact dev-support@fiskaly.com.
What your SIGN IT integration already covers
Section titled “What your SIGN IT integration already covers”Before starting, your integration is assumed to have:
- A Taxpayer created with Italian fiscalization data (
fiscalization.type=IT,tax_id_number,vat_id_number,credentials) - The Taxpayer commissioned (
state=COMMISSIONED,mode=OPERATIVE) - A
FISCAL_DEVICESystem commissioned on the Taxpayer’s Location - An
INTENTION::TRANSACTION→TRANSACTION::RECEIPT/TRANSACTION::CORRECTION/TRANSACTION::CANCELLATIONflow for fiscal receipts
None of this needs to change. The steps below add E-INVOICE IT alongside the existing setup.
Extend Taxpayer onboarding data
Add the extra company registration details that Italian e-invoicing requires.
Commission an additional System
Enable the e-invoicing service on your Taxpayer — this covers sending and, optionally, receiving.
Add the invoice transaction flow
Start issuing invoices and credit notes to businesses and consumers.
Step 1 — Extend Taxpayer onboarding data
Section titled “Step 1 — Extend Taxpayer onboarding data”E-INVOICE IT currently supports Taxpayers of type COMPANY. An INDIVIDUAL Taxpayer — a freelancer or sole trader issuing under their own codice fiscale rather than a company VAT ID — cannot be extended yet; support is coming soon.
Two additions are required on the Taxpayer that SIGN IT alone does not need:
-
address.region— the Italian Provincia code (e.g.MI,RM) is mandatory for SDI submission. If it is not already set on the Taxpayer, add it via updateTaxpayer. -
fiscalization.registration— a new block carrying Registro delle Imprese / REA data.Required fields:
company_id,office,entry,legal_form,capital,shareholder_status,liquidation_status. Thetax_regimefield defaults toORDINARYif you don’t set it.SDI requires this block for registered entities, so provide it when you onboard the Taxpayer.
Example: PATCH /taxpayers/{taxpayer_id}
{ "content": { "address": { "region": "MI" }, "fiscalization": { "type": "IT", "registration": { "company_id": "MI12345678901234567", "office": "MI", "entry": "1234567", "legal_form": "LIMITED_LIABILITY_COMPANY", "capital": "10000.00", "shareholder_status": "MULTIPLE_SHAREHOLDERS", "liquidation_status": "NOT_IN_LIQUIDATION" } } }}If your SIGN IT integration already collects the Taxpayer’s full address including region, no change is needed here — just add the registration block.
Step 2 — Commission an additional System
Section titled “Step 2 — Commission an additional System”The E_INVOICE_SERVICE System is the only System that creates and transmits e-invoices (and receives inbound ones). It doesn’t replace your FISCAL_DEVICE Systems: you still create the invoice record (TRANSACTION::INVOICE) on a FISCAL_DEVICE System (any one on the same Taxpayer), and the E_INVOICE_SERVICE System turns that data into the e-invoice.
Receiving is optional. If you want it, set fiskaly’s SDI recipient code JKKZDGR as your company’s SDI destination in your Agenzia delle Entrate (AdE) portal — any time, before or after commissioning. Without it the Taxpayer won’t receive invoices, even once the System is ready. Skip it if the Taxpayer will only send.
Use createSystem to create an E_INVOICE_SERVICE System on the Taxpayer’s HEAD_OFFICE Location, then commission it via updateSystem by setting its state to COMMISSIONED.
Only one E_INVOICE_SERVICE System can be commissioned per Taxpayer, on the HEAD_OFFICE Location (created automatically with the Taxpayer) — commissioning a second one fails. It stays separate from the FISCAL_DEVICE Systems used for receipt fiscalization, which remain unaffected no matter how many you have.
The commissioning response always shows TRANSMISSION_ONLY; call retrieveSystem afterwards to read the System’s actual compliance.state. If it stays TRANSMISSION_ONLY instead of transitioning to TRANSMISSION_RECEPTION, 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.
For the full receiving flow, see Receiving e-invoices on the Italy page.
Step 3 — Add the invoice transaction flow
Section titled “Step 3 — Add the invoice transaction flow”SIGN IT uses TRANSACTION::RECEIPT / TRANSACTION::CORRECTION / TRANSACTION::CANCELLATION.
E-INVOICE IT uses different transaction types on the same INTENTION::TRANSACTION container:
- Invoice (B2B or B2C) → create a
TRANSACTION::INVOICEon aFISCAL_DEVICESystem (as in Step 2) - Credit note → create a
TRANSACTION::CORRECTIONwithdata.type=INVOICE, referencing the original invoice viarecord.id
Both BUSINESS and CONSUMER recipients are supported. For a business recipient, the entry in the invoice’s recipients array needs an invoicing block of type SDI, plus the recipient’s Provincia:
recipients[].type=BUSINESSrecipients[].invoicing.type=SDIrecipients[].invoicing.destination_code— the recipient’s 7-character SDI inbox coderecipients[].invoicing.pec— (where required) the recipient’s PEC addressrecipients[].address.region— the recipient’s Provincia (e.g.MI,RM)
| Scenario | destination_code | pec |
|---|---|---|
| Recipient has a registered SDI inbox | their 7-character code, uppercase letters and digits (e.g. ABC1234) | optional |
| Recipient is not registered with SDI | "0000000" | required |
| Recipient is outside Italy | "XXXXXXX" | not used |
Set the recipient’s Provincia in recipients[].address.region. It 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.
For a consumer recipient (B2C), the fields are different — no destination_code of your recipient’s choosing and no VAT number, but the codice fiscale is mandatory:
recipients[].type=CONSUMERrecipients[].identification.type=TAX, withnumberset to the consumer’s codice fiscalerecipients[].name—gender,forenameandsurnamerecipients[].address— the consumer’s residence address, includingregion(Provincia)recipients[].invoicing.destination_code="0000000", withpecoptional
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 the full recipient requirements, see Sending e-invoices on the Italy page.
When a customer needs an invoice instead of a receipt
Section titled “When a customer needs an invoice instead of a receipt”Your two flows report to different places — the receipt to the AdE, the invoice to 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 on the E_INVOICE_SERVICE System in place of the receipt. That 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”Asynchronous outcome
Section titled “Asynchronous outcome”Unlike receipt flows, the SDI outcome is asynchronous. After creating the TRANSACTION::INVOICE, poll or listen for updates on the E_INVOICE::TRANSMISSION Record.
SDI outcomes typically arrive within a few minutes. However, 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.
Sent and received e-invoices are automatically preserved long-term (conservazione a norma, at least 10 years), with a preservation receipt available from the Record’s archive-artifact. No setup is required. See Archiving on the Italy page for details.
The compliance artifact for Italian e-invoicing is the FatturaPA XML, accessible on the E_INVOICE::TRANSMISSION Record.
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) | The invoice is 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.
What does not change
Section titled “What does not change”The following remain completely untouched:
- Taxpayer commissioning flow and Fisconline credentials
- All
FISCAL_DEVICESystems andBRANCHLocations - Your existing
INTENTION::TRANSACTION→TRANSACTION::RECEIPT/TRANSACTION::CORRECTION/TRANSACTION::CANCELLATIONreceipt flow