DDocflow

Dokumentace pro integrátory · verze 1

Docflow API

Pošlete PDF, vyberte šablonu a dostanete hodnoty polí. Ke každé hodnotě patří doslovná citace z dokumentu, číslo strany, jistota modelu a příznak, zda se citace v PDF opravdu našla. Pravidla šablony (součty, IČO, pořadí dat) počítá deterministický kód.

Strojově čitelná specifikace: OpenAPI / Swagger · openapi.json

Přístup

Každý klient dostane vlastní API klíč (dfk_…) s denní kvótou extrakcí. Klíč se posílá v hlavičce Authorization: Bearer <klíč>. Klient vidí jen své dokumenty. Klíč lze kdykoli odvolat a vydat nový. Pokud firma používá i aplikaci Docflow, klíč patří k jejímu pracovnímu prostoru: v API jsou dostupné i šablony, které si firma vytvořila v aplikaci, a extrakce se počítají do její kvóty. Požádat o klíč

Postup v příkladech

1. Nahrání PDF. Se stejným Idempotency-Key a stejným souborem vrátí API původní dokument (200), nevznikne duplikát.

curl -X POST https://docflow-api-yh74.onrender.com/v1/documents \
  -H "Authorization: Bearer $DOCFLOW_KEY" \
  -H "Idempotency-Key: objednavka-OP-2026-0815" \
  -F file=@objednavka.pdf
# 201 {"id": "7VCKELG_m3yoFvtkNJcm4w", "filename": "objednavka.pdf", "page_count": 1, ...}

2. Spuštění vytěžení. Běží na pozadí, odpověď přijde hned se stavem running.

curl -X POST https://docflow-api-yh74.onrender.com/v1/documents/7VCKELG_m3yoFvtkNJcm4w/extract \
  -H "Authorization: Bearer $DOCFLOW_KEY" \
  -H "Content-Type: application/json" \
  -d '{"template_id": "transport_order"}'
# 202 {"id": "3GRKSx9XRhKxqpiu_XjtDQ", "status": "running", ...}

3. Dotazování na výsledek, dokud status není running (stačí každé 2–3 s; jednostránkový dokument trvá obvykle 10–60 s). S webhookem se dotazovat nemusíte, viz Webhooky.

curl https://docflow-api-yh74.onrender.com/v1/extractions/3GRKSx9XRhKxqpiu_XjtDQ \
  -H "Authorization: Bearer $DOCFLOW_KEY"

4. Export. xlsx a json pro každý dokončený výsledek.

curl -o objednavka.xlsx \
  "https://docflow-api-yh74.onrender.com/v1/extractions/3GRKSx9XRhKxqpiu_XjtDQ/export?format=xlsx" \
  -H "Authorization: Bearer $DOCFLOW_KEY"

5. Přijaté faktury do účetnictví. pohoda a money (XML import) fungují jen pro šablonu invoice po lidském schválení a bez chybových nálezů. Schválení s případnými opravami hodnot (klíče polí podle šablony):

curl -X PATCH https://docflow-api-yh74.onrender.com/v1/extractions/<id> \
  -H "Authorization: Bearer $DOCFLOW_KEY" \
  -H "Content-Type: application/json" \
  -d '{"values": {"due_date": "17. 9. 2026"}}'

curl -o faktura-pohoda.xml \
  "https://docflow-api-yh74.onrender.com/v1/extractions/<id>/export?format=pohoda" \
  -H "Authorization: Bearer $DOCFLOW_KEY"

Webhooky

Po domluvě nastavím ke klíči adresu (https://) a předám podpisový klíč whsec_…. Po dokončení každé extrakce pošle Docflow na adresu POST s JSON {"id", "event", "created_at", "data"}, kde data je stejný objekt jako z GET /extractions/{id}. Událost extraction.completed nebo extraction.failed je i v hlavičce Docflow-Event. Odpovězte kódem 2xx do 10 s; jinak se doručení zopakuje po 5 a 30 s. Podpis v hlavičce Docflow-Signature: t=…,v1=… je HMAC-SHA256 řetězce <t>.<tělo požadavku>:

import hashlib, hmac, time

def verify(body: bytes, header: str, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256)
    fresh = abs(time.time() - int(parts["t"])) < 300  # ochrana proti přehrání
    return fresh and hmac.compare_digest(parts["v1"], expected.hexdigest())

Ukázka odpovědi

Skutečná odpověď na fiktivní objednávku přepravy, zkrácená na dvě pole. value je normalizovaná hodnota (čísla jako čísla, data jako RRRR-MM-DD), raw zápis v dokumentu. status: ok bez nálezů, needs_review s nálezy ke kontrole, approved po schválení, failed při chybě. Pravidlo má výsledek passed, failed nebo skipped (chybí hodnota).

{
  "id": "3GRKSx9XRhKxqpiu_XjtDQ",
  "document_id": "7VCKELG_m3yoFvtkNJcm4w",
  "template_id": "transport_order",
  "status": "ok",
  "model": "qwen/qwen3.6-35b-a3b",
  "created_at": "2026-10-21T14:48:55.223076Z",
  "reviewed_at": null,
  "latency_s": 11.4,
  "fields": [
    {
      "key": "loading_date",
      "label": "Datum nakládky",
      "type": "date",
      "value": "2026-11-04",
      "raw": "4. 11. 2026, 8:00",
      "page": 1,
      "quote": "Datum nakládky: 4. 11. 2026, 8:00",
      "confidence": 1.0,
      "grounded": true,
      "corrected": false
    },
    {
      "key": "weight_kg",
      "label": "Hmotnost (kg)",
      "type": "number",
      "value": 18400.0,
      "raw": "18 400 kg",
      "page": 1,
      "quote": "Hrubá hmotnost: 18 400 kg",
      "confidence": 1.0,
      "grounded": true,
      "corrected": false
    }
  ],
  "issues": [],
  "rules": [
    {
      "type": "date_order",
      "description": "Datum nakládky není po Datum vykládky",
      "fields": ["loading_date", "unloading_date"],
      "result": "passed"
    }
  ]
}

Endpointy

MetodaCestaÚčel
GET/v1/templatesTypy dokumentů (template_id), jejich pole a pravidla
POST/v1/documentsNahrání PDF (multipart, pole file); volitelně hlavička Idempotency-Key
GET/v1/documents/{id}Detail dokumentu
DELETE/v1/documents/{id}Smazání PDF, textu i všech extrakcí
POST/v1/documents/{id}/extractSpuštění vytěžení podle šablony, odpověď 202 se stavem running
GET/v1/extractions/{id}Stav a výsledek: pole s citací, stranou, jistotou, nálezy a pravidla
PATCH/v1/extractions/{id}Lidská kontrola: opravy hodnot a schválení (status approved)
GET/v1/extractions/{id}/export?format=…xlsx, json, pohoda nebo money

Šablony: invoice (faktura), transport_order (objednávka přepravy / CMR), lease (nájemní smlouva), contract (smlouva), insurance_policy (pojistka). Klíč firmy vidí navíc její vlastní šablony z aplikace (GET /templates). Šablonu na míru doplním po domluvě.

Chyby a limity

Každá chyba má stejný tvar:

{"error": {"code": "quota_exceeded", "message": "Denní kvóta 100 extrakcí je vyčerpaná (UTC)."}}
HTTPcodeVýznam
401missing_key, invalid_key, revoked_keychybí, neplatný nebo odvolaný klíč
404not_founddokument nebo extrakce neexistuje, nebo patří jinému klíči
409conflict, idempotency_conflict, extraction_running, not_reviewableoperace teď nejde (např. export do účetnictví bez schválení)
413file_too_largesoubor nad limit velikosti nebo počtu stran
415unsupported_media_typesoubor není PDF
422invalid_request, unknown_template, unknown_field, no_textneplatný požadavek
429quota_exceeded, limit_exceededvyčerpaná denní kvóta klíče nebo celkový denní limit

Chcete si to nejdřív vyzkoušet bez klíče? Zkušební stránka