Le REST API v.1 sono compatibili con qualsiasi client per API RESTful.
Se stai sviluppando in PHP, puoi scaricare la nostra libreria già pronta: https://github.com/clixclix2/SistemaTesseraSanitariaApiClient, corredata di esempi di utilizzo.
È possibile comprenderle e testarle online con Postman
Endpoint di test:
https://sistema-ts-api.it/api/v1/test
Endpoint di produzione:
https://sistema-ts-api.it/api/v1/prod
Tutte le risposte API contengono una stringa JSON.
Se non ci sono errori, il codice HTTP sarà 200 (pagina trovata e gestita senza errori).
In caso di errore, il codice potrà essere 400, 401 o
404, e il corpo conterrà un campo error:
{
"error": "messaggio di errore"
}
Tutte le chiamate GET hanno un limite massimo di 1000 risultati trasmessi dal
server. Per le opzioni di paginazione, vedere gli approfondimenti
È possibile autenticare ogni chiamata API mediante Basic Authentication, inviando negli Header della richiesta HTTP la seguente riga:
Authorization: Basic [basic-auth-string]
dove [basic-auth-string] si ottiene concatenando username, il carattere ":" e
la password (*) ed eseguendo una codifica "base64" sulla stringa ottenuta.
In alternativa, è possibile autenticare le chiamate API mediante autenticazione "Bearer".
Per maggiori informazioni, vedere gli approfondimenti.
(*) Nota: le chiamate API vanno autenticate con username e password utilizzate per accedere su sistema-ts-api.it
È possibile inviare un documento di spesa specificando solo i dati strettamente necessari, in formato JSON.
Richiesta
POST [endpoint]/documenti-spesa
Corpo della richiesta (esempio):
{
"partitaIvaErogatore": "00000000000", -- soggetto già censito nell"anagrafica
"tipoDocumento": "F", -- F = Fattura, D = Documento commerciale
"numeroDocumento": "2",
"dataDocumento": "2026-01-30",
"codiceFiscaleCittadino": "AAABBB00A00H501A",
"vociSpesa": [
{
"tipoSpesa": "SP", -- vedere tabella codici tipo spesa più sotto
"importo": 100.00,
"naturaIVA": "N2.2" -- vedere apprfondimenti su IVA più sotto
}
]
}
Risposta (esempio):
{
"id": [identificativo univoco numerico sistema-tessera-sanitaria-api],
"statoSts": [INVI|PREN|ERRO], -- INVI=Inviato, PREN=Prenotato, ERRO=Errore
"protocolloSts": [numero di protocollo rilasciato dal STS, numerico, oppure null in caso di errore],
"messaggioSts": [eventuale messaggio di errore]
}
nota: la risposta contiene anche la rappresentazione json completa dell"oggetto inviato, come visibile di seguito
Se un documento di spesa non è stato inviato al Sistema Tessera Sanitaria a causa di un errore,
è possibile aggiornare i dati del documento e ritentare l'invio mediante una chiamata
PUT:
Richiesta
PUT [endpoint]/documenti-spesa/[ID]
Il corpo della richiesta ha la stessa struttura usata per l'invio di un nuovo documento di spesa:
{
"partitaIvaErogatore": "00000000000",
"tipoDocumento": "F",
"numeroDocumento": "2",
"dataDocumento": "2026-01-30",
"codiceFiscaleCittadino": "AAABBB00A00H501A",
"vociSpesa": [
{
"tipoSpesa": "SP",
"importo": 100.00,
"naturaIVA": "N2.2"
}
]
}
Questo metodo è utile quando il documento risulta in stato ERRO: la richiesta aggiorna
i dati memorizzati e prenota un nuovo tentativo di trasmissione verso STS.
È possibile inviare al Sistema Tessera Sanitaria una comunicazione di cancellazione (ovvero annullamento
o storno) di un documento precedentemente trasmesso. La cancellazione si effettua
in maniera analoga all'invio di un documento di spesa, valorizzando però il parametro opzionale operazione con il valore CAN.
Il parametro operazione può assumere i valori INS (inserimento) o CAN (cancellazione).
Se non specificato, il valore predefinito è INS.
Richiesta
POST [endpoint]/documenti-spesa
Corpo della richiesta per la cancellazione (esempio):
{
"operazione": "CAN"
"partitaIvaErogatore": "00000000000",
"tipoDocumento": "F",
"numeroDocumento": "2",
"dataDocumento": "2026-01-30",
"dispositivo": "1", -- facoltativo
}
Per la cancellazione sono richiesti esclusivamente i dati necessari a identificare il documento già inviato: erogatore, tipo documento, numero documento, data documento e opzionalmente codice dispositivo. Non devono essere inviati i dati del cittadino né le voci di spesa.
È possibile accedere alle informazioni sui documenti inviati
Richiesta:
GET [endpoint]/documenti-spesa
È possibile aggiungere i seguenti parametri opzionali nella querystring in GET, per filtrare i risultati desiderati:
date_from -- data di invio iniziale, formato "yyyy-mm-dd hh:mm:ss" oppure "yyyy-mm-dd"
date_to -- data di invio finale, formato "yyyy-mm-dd hh:mm:ss" oppure "yyyy-mm-dd"
id_from -- ID iniziale
id_to -- ID finale
sts_protocollo_from -- identificativo SDI iniziale
sts_protocollo_to -- identificativo SDI finale
sts_protocollo_id -- identificativo SDI
partita_iva -- filtra per partita iva del soggetto erogatore
numero_documento -- numero documento esatto es: "123"
anno_documento -- Es: "2024"
tipo_documento -- Es: "F", "D", ...
Risposta (esempio):
[
{
"id": [identificativo univoco numerico sistema-ts-api],
"partitaIvaErogatore": "00000000000",
"tipoDocumento": "F",
"numeroDocumento": "2",
"dataDocumento": "2026-01-13",
"dispositivo": "1",
"dataPagamento": "2026-01-13",
"pagamentoTracciato": true,
"flagOpposizione": false,
"vociSpesa": [
{
"tipoSpesa": "SP",
"importo": "100.00",
"aliquotaIVA": null,
"naturaIVA": "N2.2"
}
],
"statoSts": "INVI",
"protocolloSts": 1234567890,
"messaggioSts": "",
"origine": "A",
"dataInserimento": "2026-01-13 12:00:00"
},
...
]
Legenda stati: "INVI"=Inviato, "PREN"=Prenotato (documento preso in carico ma ancora non trasmessa al STS), "ERRO"=Errore (vedere messaggio)
Nota: il campo codiceFiscaleCittadino non viene ritornato perché viene codificato sul server
È possibile leggere i dati aggiornamenti di una singola spedizione.
Richiesta
GET [endpoint]/documento-spesa/[ID]
Risposta
{
"id": "1",
... seguono gli stessi campi dell"oggetto json come sopra
}
È possibile gestire l"anagrafica dei soggetti erogatori via API
Creazione di un Erogatore
POST [endpoint]/erogatori
Nota: I campi obbligatori sono: partitaIva, codiceFiscale
I campi necessari per poter trasmettere documenti sono: usernameSts, passwordSts, pincodeSts
Aggiornamento di un Erogatore
PUT [endpoint]/erogatori/[ID]
Nota: è possibile specificare nel json inviato solo i dati da aggiornare
Utile ad esempio per aggiornare solo il pincode quando è scaduto
Elenco Erogatori
GET [endpoint]/erogatori
Singolo Erogatore
GET [endpoint]/erogatori/[ID]
Eliminazione Erogatore
DELETE [endpoint]/erogatori/[ID]
In caso di successo, tutte le chiamate ritornano l"oggetto in formato JSON, ad eccezione di "GET [endpoint]/erogatori" che ritorna una lista di oggetti. Formato dell'oggetto (esempio):
{
"id": "1",
"denominazione": "Erogatore test",
"partitaIva": "00000000000",
"usernameSts": "123456",
"passwordSts": "789012",
"descrizione": "",
"dataInserimento": null
}
Nota: i campi codiceFiscale e pincodeSts vengono codificati sul server è quindi non possono essere ritornati nella risposta
Tutte le richieste di tipo GET che non abbiano un [ID] specificato, ritornano liste di risultati.
FatturaElettronicaAPI per default ritorna al massimo 100 risultati.
Per ottenere più risultati, è possibile inviare in querystring il parametro per_page. Esempio:
GET [endpoint]/[risorsa]?per_page=1000
dove 1000 è il massimo valore consentito.
Per ottenere le pagine successive alla prima, è possibile inviare in querystring il parametro page. Esempio:
GET [endpoint]/[risorsa]?per_page=1000&page=2
Se otteniamo una lista vuota, significa ovviamente che non ci sono altre pagine di risultati.
Un altro modo per sapere se è presente un"altra pagina di risultati è cercare negli Header della risposta http una riga di questo tipo:
Link: <https://...../?per_page=xxx&page=x> rel="next"
È possibile prelevare tale URL ed utilizzarlo per richiedere la pagina successiva
Ogni chiamata API può essere autenticata tramite Basic-Authentication HTTP.
In alternativa, è possibile autenticare le chiamate API mediante autenticazione "Bearer", inviando negli Header della richiesta HTTP la seguente riga:
Authorization: Bearer [bearer-token]
dove [bearer-token] è una stringa ottenuta invocando l"API "/authentication" con Basic Authentication.
Richiesta
POST [endpoint]/authentication
includendo gli header di basic authentication.
Risposta (esempio)
{
"token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"expires": "yyyy-mm-dd hh:mm:ss"
}
Nota: per ogni chiamata API con basic-authentication, viene ritornato negli header della risposta http anche il token per l"autenticazione Bearer e la scadenza del token, in questo formato:
X-auth-token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-auth-expires: yyyy-mm-dd hh:mm:ss
Volendo, è dunque possibile effettuare la prima chiamata API con basic-authentication e le successive con bearer-authentication, estrapolando il token Bearer dalla risposta della prima chiamata e senza mai aver invocato esplicitamente l"API di autenticazione
Il campo tipoSpesa deve contenere uno tra i seguenti codici a due lettere.
{
"TK": "Ticket",
"FC": "Farmaco",
"FV": "Farmaco Veterinario",
"AD": "Acquisto/affitto dispositivo medico",
"AS": "Spese sanitarie",
"SR": "Prestazioni sanitarie specialistiche",
"CT": "Cure termali",
"PI": "Protesica e integrativa",
"IC": "Chirurgia/medicina estetica",
"SP": "Prestazioni sanitarie",
"SV": "Spese veterinarie",
"AA": "Altre spese"
}
Ogni voce di spesa deve specificare il tipo di IVA applicata.
È necessario specificare o il campo aliquotaIVA (con un campo numerico) o il campo naturaIVA col codice indicato dal commercialista.
I valori tipici per aliquotaIVA sono:
I valori tipici per naturaIVA sono:
Non possono essere specificati entrambi i campi aliquotaIVA e naturaIVA per la stessa voce di spesa.