Carica un listino prezzi in PDF. Ricevi un file JSON con un oggetto per articolo e i campi sempre con lo stesso nome — codice, descrizione, prezzo, um… — anche quando il fornitore le sue colonne le chiama «Cod. Art.», «Denominazione merce» e «Netto». Accanto agli articoli c’è il verdetto che serve prima di lanciare un import: codici ripetuti, righe senza codice, prezzi che numero non sono.
Costo: 2 crediti · ≈ €1,80 per elaborazione. La prima elaborazione è gratuita con i crediti di benvenuto. Se poi vuoi continuare, la ricarica minima è di €3,90; i crediti non scadono. I crediti vengono trattenuti all'avvio e restituiti per intero se l'elaborazione non riesce.
- Se l'elaborazione fallisce, i crediti tornano indietro da soli.
- Il file caricato resta privato, fuori dal web, e viene eliminato automaticamente: subito dopo un'elaborazione riuscita, entro pochi giorni in ogni altro caso.
- Ogni risultato passa controlli automatici, con livello di confidenza indicato.
- Questo strumento invia a OpenAI il testo estratto dal documento solo quando la lettura sui nostri server è incerta. Dettagli in Trattamento dati & AI.
Serve un account gratuito: con i crediti di benvenuto la prima elaborazione è offerta. Registrati in 30 secondi
Guarda un esempio di risultato
Cosa fa
Trasforma un listino pensato per la stampa in dati leggibili da un software. Ogni articolo diventa un oggetto JSON con campi come codice, descrizione, unità di misura e prezzo; i prezzi vengono convertiti in numeri con il punto decimale. Un valore che numero non è — «a richiesta», «n.d.» — resta la scritta del documento e non diventa mai uno zero: quando capita, il riepilogo dice in quale colonna e quanti sono, perché la colonna resta dichiarata numerica. C’è un secondo caso, e la differenza sta in chi ha sbagliato: lo spazio fra le migliaia, «€ 1 559,62», lo leggiamo quando il PDF scrive l’importo tutto d’un pezzo; se invece lo stampa a pezzi separati non sappiamo distinguerlo da due colonne accostate, e piuttosto che inventare un prezzo mille volte più grande lasciamo la cella com’è scritta, come testo. Quando capita non diamo la colpa al tuo documento: il riepilogo, e le note dentro il JSON, dichiara che a non averlo letto siamo stati noi, quanti sono e in quale colonna stanno. E se una colonna che il documento porta non viene letta in nessuna riga, il risultato non si dichiara completo: te la nominiamo, e le celle restano vuote invece di essere indovinate. Le colonne effettivamente trovate nel documento determinano i campi: nulla viene inventato per riempire uno schema.
Per chi è
Sviluppatori e system integrator che devono importare listini fornitore in gestionali, ERP o piattaforme e-commerce, e aziende che vogliono smettere di fare data entry manuale a ogni aggiornamento prezzi.
Come funziona
- Carichi il listino PDF (fino a 15 MB).
- Il motore estrae le tabelle articoli e mappa ogni colonna su un campo JSON.
- Prezzi e quantità vengono normalizzati in valori numerici, con il tipo di ogni campo dichiarato nell’intestazione del file.
- Scarichi il file JSON e lo importi nel tuo sistema.
Input supportati
Listini in PDF con testo selezionabile (generati digitalmente) fino a 15 MB e circa 80 pagine per elaborazione, anche con sezioni di categoria intercalate tra gli articoli: le loro intestazioni non spezzano l’elenco e non diventano articoli, ma non compaiono fra i dati del JSON — il riepilogo dell’elaborazione le elenca una per una, con il testo che il documento riporta. Quando in un listino ce ne sono troppe per stare in una nota leggibile, il riepilogo ne elenca quante ce ne stanno e ti dice quante ne restano fuori dall’elenco: il numero complessivo non viene mai taciuto. I listini scansionati (immagini) non sono ancora supportati: in quel caso l’elaborazione viene segnalata subito come non riuscita e non ti viene addebitato nulla. Un listino in parte digitale e in parte scansionato (una pagina fotografata, un allegato acquisito con lo scanner) viene invece elaborato e addebitato, perché il testo delle altre pagine c’è: in quel caso il risultato ti dice quali pagine non contenevano testo selezionabile e che il loro contenuto non è in questo risultato, invece di dichiararsi completo. Se invece la parte digitale non contiene tabelle — per esempio è generata al computer solo la copertina, e il resto è tutto scansionato — non resta niente da consegnare: il lavoro viene segnalato come non riuscito, ti diciamo quante pagine su quante erano senza testo selezionabile e non ti viene addebitato nulla. I PDF protetti da password vengono rifiutati allo stesso modo: senza la password le pagine non si aprono, l’elaborazione si ferma subito e non ti viene addebitato nulla. Apri il file con la sua password, salvane una copia senza protezione e carica quella. Le 80 pagine sono il tetto massimo, non la regola: quando le righe non stanno in una griglia netta la lettura passa dall’intelligenza artificiale, che riceve al massimo circa 280.000 caratteri di testo — quanto ottanta pagine di media. I due tetti sono tarati per mordere nello stesso punto: misurato l’8 settembre 2026 su dieci documenti di gara italiani veri, è esattamente quanto testo portano ottanta pagine. Solo su un documento molto più fitto della media quel limite arriva prima dell’ottantesima pagina. Il risultato dichiara sempre a quale pagina la lettura si è fermata, e il messaggio ti dice da quale pagina ripartire. Quando il documento prosegue oltre il taglio la parte letta ti viene consegnata lo stesso, con il taglio dichiarato: il lavoro si conclude e i crediti restano spesi, anche se i dati che cercavi stavano oltre. Puoi caricare come lavoro separato un PDF con le sole pagine che ti servono.
C’è una seconda perdita possibile, indipendente da questi due tetti: dentro le pagine lette l’estrazione assistita dall’intelligenza artificiale può smettere di elencare prima della fine, restituendo articoli giusti ma pochi. Ce ne accorgiamo confrontando il risultato consegnato con due letture indipendenti dello stesso documento: la griglia che legge le tabelle riga per riga e, quando la griglia non riconosce la struttura del documento, il conteggio delle righe del testo estratto che hanno la forma di una riga di tabella. Quando una delle due si scosta dal risultato, il file lo dichiara con entrambi i conteggi e si considera incompleto. Quando una delle due lo dice, la perdita è nostra e non del tuo documento: il file ti arriva lo stesso e non lo paghi — il riepilogo lo dice con le parole «non te lo facciamo pagare» e i crediti ti tornano indietro da soli. Non è però una garanzia: su un documento fatto in prevalenza di prosa, con qualche tabella dentro, nessuna delle due letture sa dire quante ne dovevano tornare, e una perdita lì non te la segnala nessuno. Il controllo che costa dieci secondi è questo: import.articoli_totali dice quanti articoli sono entrati nel file, e l’ultima pagina di un listino di solito scrive quanti ne ha. Ricaricare il PDF a blocchi di poche pagine per volta è il modo più efficace per recuperare gli articoli mancanti.
C’è infine un tetto che non riguarda il documento ma la nostra risposta: gli articoli tornano indietro in un’unica risposta del modello, e quella risposta ha uno spazio finito. Un documento che ne contiene moltissime lo esaurisce. Se lo esaurisce prima che ne arrivi una parte utilizzabile, il lavoro viene segnalato come non riuscito, il messaggio ti dice che il documento contiene più voci di quante riusciamo a restituirne in una volta sola e non ti viene addebitato nulla; se lo esaurisce dopo, il risultato ti viene consegnato con il taglio dichiarato fra le note, e non lo paghi: i crediti ti tornano indietro. In entrambi i casi il gesto è lo stesso: caricare il PDF a blocchi di poche pagine per volta.
Risultato
Ecco la forma esatta di quello che scarichi — i valori qui sotto sono un esempio, non una misura. Un file JSON con tre parti. In cima import: verdetto (importabile oppure da_controllare), riepilogo in italiano, articoli — un oggetto per articolo con i campi sempre chiamati allo stesso modo — e mappatura, che dice quale colonna del tuo documento è diventata quale campo. Poi summary: righe estratte, colonne, pagine elaborate, confidenza. Infine tables: il listino come sta nel PDF, con le intestazioni originali, nel caso ti serva una colonna che il vocabolario canonico non copre.
{
"import": {
"verdetto": "importabile",
"riepilogo": "410 articoli, nessun codice ripetuto e nessuna riga senza codice, tutti i prezzi letti come numero: il listino è buono per l'import",
"articoli_totali": 410,
"chiavi": ["codice", "descrizione", "um", "prezzo"],
"mappatura": { "codice": "Cod. Art.", "descrizione": "Denominazione merce", "um": "Confezione", "prezzo": "Netto" },
"campi_non_presenti": ["ean", "categoria", "marca", "quantita_minima", "sconto_percento", "prezzo_lordo", "iva_percento"],
"colonne_non_mappate": [{ "chiave": "note_interne", "intestazione": "Note interne" }],
"controlli": { "codici_ripetuti": {"quanti": 0}, "righe_senza_codice": {"quanti": 0}, "prezzi_non_numerici": {"quanti": 0} },
"articoli": [
{ "codice": "FX-9", "descrizione": "Tubo rame 15mm", "um": "mt", "prezzo": 8.4 }
]
},
"summary": { "rows_extracted": 410, "columns": 4, "pages_processed": 12 },
"tables": [ { "name": "Listino", "columns": […], "rows": […] } ]
}
I campi canonici sono questi, e non ne inventiamo nessuno: codice, ean, descrizione, categoria, marca, um, quantita_minima, prezzo, sconto_percento, prezzo_lordo, iva_percento. Quelli che il tuo listino non porta non compaiono vuoti: stanno in campi_non_presenti, così lo sai prima di lanciare l’import invece di scoprirlo dopo. E una colonna del documento che non trova casa fra i campi canonici non si perde: è elencata in colonne_non_mappate e resta leggibile in tables.
Limiti
La qualità dell’estrazione dipende dalla struttura del PDF: layout molto grafici o poco regolari riducono la precisione, e la confidenza riportata nel riepilogo scende di conseguenza. I campi presenti nel JSON riflettono le colonne del listino: se il documento non riporta l’IVA o la disponibilità, quei campi non ci saranno. In caso di fallimento i crediti vengono rimborsati.
Privacy e dati
Il listino caricato viene conservato in un’area privata non accessibile dal web, usato solo per l’elaborazione ed eliminato automaticamente: subito dopo un’elaborazione riuscita, entro due giorni se l’elaborazione fallisce (in quel caso il file serve a capire cosa non ha funzionato). Il file JSON generato resta scaricabile solo dal tuo account per 14 giorni, poi viene eliminato. I contenuti non vengono usati per addestrare modelli. I prezzi dei tuoi fornitori restano tuoi.
Domande frequenti
Lo schema JSON è sempre lo stesso?
Sì, per import.articoli: i nomi dei campi sono sempre gli stessi undici, qualunque sia l’intestazione del PDF, e import.mappatura dice a quale colonna del documento corrisponde ognuno. È questo che ti permette di scrivere l’import una volta sola e riusarlo per tutti i fornitori. Varia invece quali di quegli undici campi ci sono, perché dipende da che cosa il listino riporta: import.chiavi elenca quelli presenti in questo file e import.campi_non_presenti quelli che mancano, così il tuo codice può controllarlo invece di indovinare. Il blocco tables, che riporta il documento con le sue intestazioni originali, resta com’era: se avevi già un import scritto su quello, continua a funzionare.
Pago anche se il file è incompleto?
Dipende da chi ha perso le righe. Se il listino va oltre un limite scritto qui sopra — le 80 pagine, i circa 280.000 caratteri, le pagine scansionate di un PDF misto — ricevi la parte letta e la paghi: quanto leggiamo lo sai prima di caricare. Se invece qualcosa lo abbiamo perso noi dentro le pagine lette — la risposta del modello finita prima della fine dell’elenco, due letture che non coincidono, una colonna del listino dichiarata e mai riempita, frammenti rimasti fuori dalle colonne — il file ti arriva lo stesso, il riepilogo lo dice con le parole «non te lo facciamo pagare» e i crediti ti tornano indietro. Nel registro dei crediti trovi il movimento come «File incompleto per una nostra lettura, non addebitato».
Posso integrarlo in un flusso automatico?
Non ancora: la versione API (Price List → JSON API) è in preparazione e non è ancora disponibile. Il JSON che scarichi da questa pagina è però già pronto per uno script di import, e puoi convertire fino a 50 listini al giorno per account.
Come vengono gestiti i prezzi a scaglioni?
Vengono riportati come compaiono nel documento, con uno scaglione per campo o per riga a seconda del layout originale. Non vengono effettuati calcoli o interpolazioni.