Analizza le fatture ricevute tramite API: carica una fattura e ottieni i campi e un file per la contabilità. Modello a saldo, senza abbonamento.Analizza le fatture ricevute tramite REST: carica un documento e ottieni campi strutturati e un'esportazione pronta per la contabilità. Saldo prepagato, nessun abbonamento.
Accetta una fattura ricevuta da un fornitore e restituisce dati strutturati oltre a un file pronto per la contabilità. Non emettiamo fatture e non accettiamo pagamenti — ci occupiamo solo dell'analisi.Accetta una fattura ricevuta da un fornitore e restituisce campi strutturati oltre a un file pronto per la contabilità. Non emettiamo fatture e non accettiamo pagamenti — solo analisi.
Le fatture elettroniche vengono lette tramite codice — con precisione e senza addebiti. Paghi solo per scansioni e foto.Le fatture elettroniche vengono analizzate tramite codice — in modo preciso e senza addebiti. Paghi solo per scansioni e foto.
X-Api-Key.Invia la chiave nell'intestazione X-Api-Key.X-Api-Key: your_api_key_here
| MetodoMetodo | Path | FunzioneFunzione |
|---|---|---|
| POST | /v1/parse | Carica una fattura (multipart: file, country)Carica una fattura (multipart: file, country) |
| GET | /v1/parse/{job_id} | Stato dell'attività e campi analizzatiStato dell'attività e campi analizzati |
| GET | /v1/usage | Utilizzo e saldo residuoUtilizzo e saldo residuo |
| GET | /v1/price | Prezzo (pubblico, senza chiave)Prezzo (pubblico, senza chiave) |
| GET | /v1/countries | Paesi e formati (pubblico)Paesi e formati (pubblico) |
Documentazione interattiva: /docs · /redoc · openapi.jsonDocumentazione interattiva: /docs · /redoc · openapi.json
curl -X POST https://duebuddy.work/v1/parse \
-H "X-Api-Key: your_api_key_here" \
-F "country=de" \
-F "[email protected]"
# {"ok":true,"job_id":41,"status":"queued","charged":true}
curl https://duebuddy.work/v1/parse/41 \
-H "X-Api-Key: your_api_key_here"
import requests, time
BASE = "https://duebuddy.work/v1"
HEAD = {"X-Api-Key": "your_api_key_here"}
def parse(path, country="de"):
with open(path, "rb") as f:
r = requests.post(f"{BASE}/parse", headers=HEAD,
files={"file": f}, data={"country": country}, timeout=60)
r.raise_for_status()
job = r.json()
for _ in range(30): # ждём результат
time.sleep(2)
out = requests.get(f"{BASE}/parse/{job['job_id']}", headers=HEAD, timeout=30).json()
if out.get("status") in ("done", "failed"):
return out
raise TimeoutError("parse timeout")
res = parse("invoice.pdf", "de")
print(res["fields"]) # поля счёта
const fd = new FormData();
fd.append("country", "us");
fd.append("file", fileInput.files[0]);
const r = await fetch("https://duebuddy.work/v1/parse", {
method: "POST",
headers: { "X-Api-Key": API_KEY },
body: fd
});
const { job_id } = await r.json();
const out = await fetch(`https://duebuddy.work/v1/parse/${job_id}`,
{ headers: { "X-Api-Key": API_KEY } }).then(r => r.json());
console.log(out.fields);
Salva come parse.html e apri nel browser — trascina il file e ottieni il risultato. La chiave viene conservata solo nel tuo browser.Salva come parse.html, aprilo nel browser e trascina un file al suo interno. La chiave rimane solo nel tuo browser.
<!doctype html>
<meta charset="utf-8">
<title>DueBuddy parse</title>
<style>body{font:15px system-ui;margin:40px;max-width:640px}
#d{border:2px dashed #999;border-radius:12px;padding:40px;text-align:center}
pre{background:#f4f4f5;padding:14px;border-radius:8px;overflow:auto}</style>
<input id="k" placeholder="API key" style="width:100%;padding:8px">
<div id="d">Drop an invoice here (PDF / JPG / PNG / XML)</div>
<pre id="o">—</pre>
<script>
const d = document.getElementById("d"), o = document.getElementById("o");
d.ondragover = e => e.preventDefault();
d.ondrop = async e => {
e.preventDefault();
const f = e.dataTransfer.files[0];
const fd = new FormData();
fd.append("country", "de");
fd.append("file", f);
const head = { "X-Api-Key": document.getElementById("k").value };
const j = await fetch("https://duebuddy.work/v1/parse",
{ method: "POST", headers: head, body: fd }).then(r => r.json());
o.textContent = JSON.stringify(j, null, 2);
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 2000));
const out = await fetch("https://duebuddy.work/v1/parse/" + j.job_id,
{ headers: head }).then(r => r.json());
o.textContent = JSON.stringify(out, null, 2);
if (out.status === "done" || out.status === "failed") break;
}
};
</script>
{
"ok": true,
"job_id": 41,
"status": "done",
"fields": {
"invoice_number": "RE-2026-04871",
"invoice_date": "2026-09-14",
"due_date": "2026-10-14",
"vendor_name": "Hartmann GmbH",
"net_amount": "1048.74",
"vat_amount": "199.26",
"gross_amount": "1248.00",
"currency": "EUR"
},
"fields_detailed": [{"key": "gross_amount", "value": "1248.00", "edited": false}]
}
L'insieme dei campi dipende dal paese (country). Sono inoltre disponibili esportazioni specifiche per il paese: XRechnung, ZUGFeRD, DATEV, 1C, UBL, FatturaPA e altro.L'insieme dei campi dipende da country. Sono inoltre disponibili esportazioni specifiche per il paese: XRechnung, ZUGFeRD, DATEV, 1C, UBL, FatturaPA e altro.
| CodiceCodice | detail | MotivoMotivo |
|---|---|---|
| 400 | unsupported_country | Paese non supportatoPaese non supportato |
| 400 | unsupported_file_type | Non è un PDF/JPG/PNG/XMLNon è un PDF/JPG/PNG/XML |
| 400 | empty_file | File vuotoFile vuoto |
| 413 | file_too_large | Il file supera il limiteIl file supera il limite |
| 429 | rate_limited | Oltre 120 richieste al minutoOltre 120 richieste al minuto |
Elaboriamo le fatture ricevute. Non emettiamo fatture a tuo nome e non accettiamo pagamenti per te.Elaboriamo le fatture ricevute. Non emettiamo fatture per tuo conto e non accettiamo pagamenti per te.