Analyse des factures reçues via API : téléversez une facture et obtenez ses champs ainsi qu’un fichier pour la comptabilité. Modèle à solde prépayé, sans abonnement.Analysez les factures reçues via REST : téléversez un document et obtenez des champs structurés ainsi qu’un export prêt pour la comptabilité. Solde prépayé, sans abonnement.
Elle accepte une facture reçue d’un fournisseur et renvoie des données structurées ainsi qu’un fichier prêt pour la comptabilité. Nous n’émettons pas de factures et n’acceptons pas de paiements — analyse uniquement.Elle accepte une facture reçue d’un fournisseur et renvoie des champs structurés ainsi qu’un fichier prêt pour la comptabilité. Nous n’émettons pas de factures et n’acceptons pas de paiements — analyse uniquement.
Les factures électroniques sont lues par code — avec précision et sans frais. Vous payez uniquement pour les scans et les photos.Les factures électroniques sont analysées par code — avec précision et sans frais. Vous payez uniquement pour les scans et les photos.
X-Api-Key.Envoyez la clé dans l’en-tête X-Api-Key.X-Api-Key: your_api_key_here
| MéthodeMéthode | Chemin | FonctionFonction |
|---|---|---|
| POST | /v1/parse | Téléverser une facture (multipart : file, country)Téléverser une facture (multipart : file, country) |
| GET | /v1/parse/{job_id} | État du traitement et champs analysésÉtat du traitement et champs analysés |
| GET | /v1/usage | Utilisation et solde restantUtilisation et solde restant |
| GET | /v1/price | Prix (public, sans clé)Prix (public, sans clé) |
| GET | /v1/countries | Pays et formats (public)Pays et formats (public) |
Documentation interactive : /docs · /redoc · openapi.jsonRéférence interactive : /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);
Enregistrez sous parse.html et ouvrez dans un navigateur — faites glisser un fichier pour obtenir le résultat. La clé reste uniquement dans votre navigateur.Enregistrez sous parse.html, ouvrez le fichier dans un navigateur et déposez-y un fichier. La clé reste uniquement dans votre navigateur.
<!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’ensemble des champs dépend du country. Des exports propres à chaque pays sont également disponibles : XRechnung, ZUGFeRD, DATEV, 1C, UBL, FatturaPA et autres.L’ensemble des champs dépend du country. Des exports propres à chaque pays sont également disponibles : XRechnung, ZUGFeRD, DATEV, 1C, UBL, FatturaPA et autres.
| CodeCode | detail | MotifMotif |
|---|---|---|
| 400 | unsupported_country | Pays non pris en chargePays non pris en charge |
| 400 | unsupported_file_type | Format différent de PDF/JPG/PNG/XMLFormat différent de PDF/JPG/PNG/XML |
| 400 | empty_file | Fichier videFichier vide |
| 413 | file_too_large | Fichier dépassant la limiteFichier dépassant la limite |
| 429 | rate_limited | Plus de 120 requêtes par minutePlus de 120 requêtes par minute |
Nous traitons les factures reçues. Nous n’émettons pas de factures en votre nom et n’acceptons pas de paiements pour vous.Nous traitons les factures reçues. Nous n’émettons pas de factures en votre nom et n’acceptons pas de paiements pour vous.