API per sviluppatori
Piano ProLe API REST di ScontrinoZero permettono di integrare l'emissione di scontrini elettronici direttamente nel tuo gestionale, POS o e-commerce. Ogni chiamata usa le credenziali Fisconline del tuo esercente e trasmette il documento all'Agenzia delle Entrate in tempo reale.
Prerequisiti
- Account ScontrinoZero con Piano Pro attivo.
- Credenziali Fisconline configurate nella sezione Configurazione attività.
- Una chiave API di tipo business generata dalla dashboard: vai su Impostazioni → Altre impostazioni → API key, clicca + Nuova API key, assegnale un nome descrittivo (es. "POS principale"), clicca Genera e copia la chiave — sarà mostrata una sola volta.
Autenticazione
Includi la chiave API in ogni richiesta tramite l'header Authorization:
Authorization: Bearer szk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXBase URL
https://api.scontrinozero.it/v1Sandbox
Per sviluppare e testare la tua integrazione senza emettere scontrini reali all'Agenzia delle Entrate, usa l'ambiente sandbox:
https://api-sandbox.scontrinozero.it/v1Il sandbox è identico alla produzione, ma ogni chiamata all'AdE è simulata — nessun documento viene trasmesso. Le risposte hanno la stessa struttura di quelle reali; il campo adeProgressive è fittizio e contiene il prefisso MOCK- (es. DCW2026/MOCK-1).
- Registra un account separato su sandbox.scontrinozero.it (non collegato alla produzione).
- Le credenziali Fisconline accettano qualsiasi valore nel sandbox.
- I dati sandbox possono essere resettati senza preavviso.
- La chiave API sandbox inizia sempre con
szk_live_— è un token di accesso all'ambiente sandbox, non alla produzione.
Endpoint
| Metodo | Path | Descrizione |
|---|---|---|
| POST | /v1/receipts | Emetti uno scontrino |
| GET | /v1/receipts | Lista scontrini in un intervallo di date |
| GET | /v1/receipts/{id} | Recupera lo stato di uno scontrino |
| POST | /v1/receipts/{id}/void | Annulla uno scontrino |
POST/v1/receipts
Emette uno scontrino elettronico e lo trasmette all'Agenzia delle Entrate.
Corpo della richiesta
| Campo | Tipo | Descrizione |
|---|---|---|
| lines | array (1–100) | Righe dello scontrino |
| lines[].description | string (1–200) | Descrizione del prodotto/servizio |
| lines[].quantity | number (> 0, ≤ 9999) | Quantità, max 3 decimali |
| lines[].grossUnitPrice | number (≥ 0) | Prezzo unitario IVA inclusa (€) |
| lines[].vatCode | string (enum) | Codice aliquota IVA (vedi tabella sotto) |
| paymentMethod | string (enum) | PC = contanti, PE = carta/elettronico |
| idempotencyKey | string (UUID v4) | Chiave di idempotenza (vedi sezione Idempotenza) |
| lotteryCode | string (8 char [A-Z0-9]) | null | Codice lotteria scontrini (opzionale). Rilevante solo con PE e se il totale scontrino è ≥ €1,00; viene ignorato con PC. |
Esempio
curl -X POST https://api.scontrinozero.it/v1/receipts \
-H "Authorization: Bearer szk_live_XXXX" \
-H "Content-Type: application/json" \
-d '{
"lines": [
{
"description": "Pizza Margherita",
"quantity": 2,
"grossUnitPrice": 8.00,
"vatCode": "10"
},
{
"description": "Acqua naturale",
"quantity": 1,
"grossUnitPrice": 2.50,
"vatCode": "10"
}
],
"paymentMethod": "PE",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000",
"lotteryCode": "ABCD1234"
}'Risposta — 201 Created
{
"documentId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"adeTransactionId": "151085589",
"adeProgressive": "DCW2026/5111-2188"
}GET/v1/receipts
Restituisce la lista paginata degli scontrini emessi nell'intervallo di date indicato. Utile per riconciliazione contabile, export periodico o sync verso sistemi gestionali.
Parametri query
| Parametro | Tipo | Req. | Descrizione |
|---|---|---|---|
| from | YYYY-MM-DD | Sì | Inizio intervallo (incluso, UTC) |
| to | YYYY-MM-DD | Sì | Fine intervallo (incluso, UTC). Max 31 giorni da from. |
| page | intero ≥ 1 | No | Pagina (default: 1) |
| limit | 1–100 | No | Risultati per pagina (default: 20, max: 100) |
| kind | SALE | VOID | No | Filtra per tipo documento (default: entrambi) |
Esempio
curl "https://api.scontrinozero.it/v1/receipts?from=2026-04-01&to=2026-04-30&limit=100" \
-H "Authorization: Bearer szk_live_XXXX"Se sono stati emessi più di 100 scontrini nel periodo, usa &page=2, &page=3, ecc. Il campo pagination.hasNextPage indica se esistono ulteriori pagine.
Risposta — 200 OK
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000",
"kind": "SALE",
"status": "ACCEPTED",
"adeTransactionId": "151085589",
"adeProgressive": "DCW2026/5111-2188",
"lotteryCode": null,
"paymentMethod": "PE",
"total": "18.50",
"createdAt": "2026-04-05T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 100,
"total": 1,
"hasNextPage": false
}
}La risposta non include le righe di dettaglio. Per il contenuto completo di uno scontrino usa GET /v1/receipts/{id} (campo lines incluso).
GET/v1/receipts/{id}
Restituisce i dettagli e lo stato di uno scontrino emesso. Utile per verificare l'esito di un'emissione o per implementare l'idempotency check sul tuo client.
Esempio
curl https://api.scontrinozero.it/v1/receipts/a1b2c3d4-e5f6-7890-abcd-ef1234567890 \
-H "Authorization: Bearer szk_live_XXXX"Risposta — 200 OK
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"kind": "SALE",
"status": "ACCEPTED",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000",
"adeTransactionId": "151085589",
"adeProgressive": "DCW2026/5111-2188",
"createdAt": "2026-03-26T10:00:00.000Z",
"paymentMethod": "PE",
"lotteryCode": "ABCD1234",
"voidedDocumentId": null,
"total": "18.50",
"lines": [
{
"description": "Pizza Margherita",
"quantity": "2.000",
"grossUnitPrice": "8.00",
"vatCode": "10"
},
{
"description": "Acqua naturale",
"quantity": "1.000",
"grossUnitPrice": "2.50",
"vatCode": "10"
}
]
}| Campo | Descrizione |
|---|---|
| kind | SALE (vendita) o VOID (annullo). |
| status | ACCEPTED, VOID_ACCEPTED, REJECTED, ERROR o PENDING. |
| paymentMethod | PC (contanti) o PE (carta/elettronico), così come inviato in emissione. |
| lotteryCode | Codice lotteria scontrini, null se non fornito o se il metodo di pagamento è PC. |
| voidedDocumentId | Presente solo per documenti VOID: UUID del SALE che è stato annullato. |
| total | Totale calcolato dalle righe, con 2 decimali (es. "18.50"). |
| lines[].quantity | Stringa con 3 decimali fissi (es. "2.000"). |
| lines[].grossUnitPrice | Stringa con 2 decimali fissi (es. "8.00"), in euro. |
POST/v1/receipts/{id}/void
Annulla uno scontrino precedentemente emesso. L'annullamento è irreversibile e viene trasmesso all'Agenzia delle Entrate.
Corpo della richiesta
| Campo | Tipo | Descrizione |
|---|---|---|
| idempotencyKey | string (UUID v4) | Chiave di idempotenza per l'annullamento |
Esempio
curl -X POST https://api.scontrinozero.it/v1/receipts/a1b2c3d4-e5f6-7890-abcd-ef1234567890/void \
-H "Authorization: Bearer szk_live_XXXX" \
-H "Content-Type: application/json" \
-d '{"idempotencyKey": "b2c3d4e5-f6a7-8901-bcde-f01234567890"}'Risposta — 200 OK
{
"voidDocumentId": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"adeTransactionId": "151085590",
"adeProgressive": "DCW2026/5111-2189"
}Codici IVA
Il campo vatCode accetta i seguenti valori:
| Valore | Aliquota | Regime |
|---|---|---|
| 4 | 4% | Ridotta (es. beni di prima necessità) |
| 5 | 5% | Ridotta (es. alcuni prodotti farmaceutici) |
| 10 | 10% | Ridotta (es. alimenti, ristorazione, turismo) |
| 22 | 22% | Ordinaria |
| N1 | 0% | Art. 15 DPR 633/72 — Escluso da IVA |
| N2 | 0% | Non soggetto a IVA |
| N3 | 0% | Non imponibile |
| N4 | 0% | Esente |
| N5 | 0% | Regime del margine |
| N6 | 0% | Inversione contabile (reverse charge) |
Idempotenza
Ogni richiesta di emissione e annullamento richiede un campo idempotencyKey: un UUID v4 univoco che identifichi quella specifica operazione.
Se invii la stessa richiesta due volte con lo stesso idempotencyKey (es. in seguito a un timeout di rete), il sistema restituisce ilrisultato dell'operazione originale senza emettere un secondo scontrino. Genera una nuova chiave per ogni scontrino distinto.
// Esempio generazione in JavaScript
const idempotencyKey = crypto.randomUUID();Rate limiting
I limiti sono per chiave API, con finestra scorrevole di 1 ora:
| Endpoint | Limite |
|---|---|
| POST /v1/receipts | 120 richieste / ora |
| GET /v1/receipts | 60 richieste / ora |
| POST /v1/receipts/{id}/void | 20 richieste / ora |
Al superamento del limite ricevi una risposta 429 con header Retry-After che indica i secondi da attendere prima di riprovare.
Codici di errore
Tutti gli errori restituiscono un oggetto JSON con il campo error:
{ "error": "Descrizione dell'errore." }| Codice | Causa |
|---|---|
| 400 | Richiesta non valida: corpo malformato (campo mancante, tipo errato, UUID non valido) oppure, sulla lista, un parametro di query malformato — page o limit non interi o minori di 1, oppure kind diverso da SALE/VOID. I valori malformati vengono rifiutati, non corretti in silenzio (un limit oltre 100 fa eccezione: viene ridotto a 100). |
| 401 | Chiave API assente, non valida, revocata o scaduta. |
| 402 | Il piano attivo non include l'accesso alle API. Passa al Piano Pro. |
| 404 | Scontrino non trovato: l'ID non esiste o appartiene a un altro esercente. Vale per GET /v1/receipts/{id} e per l'annullamento. |
| 409 | Due casi, distinti dal campo code nel body. Conflitto di idempotenza: una richiesta con la stessa idempotencyKey è ancora in corso, è già stata rifiutata, oppure la chiave è stata riusata con un contenuto diverso (in quest'ultimo caso usa una nuova chiave). Oppure code ADE_REAUTH_REQUIRED: la sessione con l'Agenzia delle Entrate (CIE) è scaduta e va rinnovata dall'app web ScontrinoZero — il retry automatico è inutile finché l'esercente non si ricollega. |
| 422 | Errore di logica: scontrino già annullato, credenziali AdE mancanti, o risposta di rifiuto dall'Agenzia delle Entrate. |
| 429 | Rate limit superato. Riprova tra qualche minuto. |
| 500 | Errore interno del server. |
| 503 | Servizio temporaneamente sovraccarico (es. database sotto pressione). È un errore transitorio: riprova dopo i secondi indicati nell'header Retry-After. |