Document Intelligence API

Story-Katalog · Schnellstart · Rezepte · Antwort-Prinzipien · Fehler · Betrieb · Für Agenten · Schlüssel
Dokumente rein — geprüfte, belegte Daten raus: Prüfprotokolle, Rechnungen, Lieferscheine, Bescheinigungen, Zeugnisse, Bau-Unterlagen. Jede Angabe mit Fundstelle zum Nachklicken und Prüfquellen; Unbelegtes wird nie geraten, sondern ehrlich als NOT_FOUND/not_checkable ausgewiesen. Produktiv extrahiert heute: Bau-Packs; weitere Dokumentklassen erkennt die API bereits und nennt ehrlich ihren Status.
🧑 Für Menschen (Bau-Praxis) Für Entwickler: unten der Schnellstart (erste Antwort in 5 Minuten) und die Rezepte (komplette Wege mit echten Antworten). Erst prüfen, was die Engine schon liest: der Story-Katalog — alle Fähigkeiten als User Stories (WAS für WEN), mit ehrlichem Status; Fehlendes dort direkt als Wunsch bestellen. API-Schlüssel: Formular auf developer.1885.cloud (siehe Schlüssel).
🤖 Für Agenten (autonome Nutzung) Maschinenlesbarer Einstieg: /llms.txt (Kurzbeschreibung aller Fähigkeiten) · /openapi.json (Routen) · MCP-Server unter POST /mcp — Details in Für Agenten.

Schnellstart — erste Antwort in 5 Minuten

1
Schlüssel besorgen. Antrag direkt im Formular auf developer.1885.cloud (Name + Zweck genügt; Key kommt nach Freigabe per E-Mail). Den Schlüssel als Umgebungsvariable ablegen, nie in Code oder Chat: export KEY=...
2
Verbindung testen.
curl -H "Authorization: Bearer $KEY" https://di.api.1885.cloud/health
Antwort (echt): {"ok":true,"rules_origin":"db","rules_active":14}
3
Erste echte Aufgabe — Dokumente einer Ausschreibung nach Rolle sortieren:
curl -X POST https://di.api.1885.cloud/v1/classify \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"tender_ref": "DTAD:24545281"}'
Ergebnis: jede Anlage bekommt ihre Rolle (Leistungsverzeichnis, Lageplan, Baugrundgutachten, Verkehrszeichenplan …) samt Evidenz-Zitat, warum.

Was kann die API schon? — der Story-Katalog

Jede Fähigkeit der Engine ist als User Story beschrieben: WAS für WEN aus Dokumenten gelesen wird, mit Akzeptanzkriterien und ehrlichem Status (produktiv/teilweise/geplant). Bevor ihr integriert: di.1885.cloud/stories durchsuchen (Themenblöcke: Ausschreibung, Prüfprotokolle, CAD-Zeichnungen, ISO 50001, Lieferscheine, Bescheinigungen) und prüfen, ob euer Bedarf schon bestellt ist. Fehlt eure Story? Direkt auf der Seite als Wunsch einreichen — jeder Wunsch wird vom Product Owner beantwortet, freigegebene Stories erscheinen im Katalog. Maschinenlesbar (ohne Key):

curl "https://di.api.1885.cloud/v1/stories?q=Pr%C3%BCftermin"

Antwort (echt, gekürzt): {"stories_gesamt":1,"themen":[{"titel":"Prüfprotokolle & Arbeitssicherheit","stories":[{"id":"PRF-1","persona":"Geräteverantwortliche:r","status":"geplant","natur":1,…}]}]} · Filter: ?thema=, ?status=produktiv, ?natur=2 · Wunsch: POST /v1/stories/wunsch

Sofort loslegen — mit euren eigenen Dokumenten

Der schnellste erste Erfolg: nehmt irgendein eigenes PDF — ein Prüfprotokoll, eine Rechnung, einen Lieferschein, ein Zeugnis — und reicht es bei POST /v1/dokumente ein (Rezept 1). Die API sagt euch, was sie erkannt hat und was sie damit kann; Unbekanntes beantwortet sie ehrlich statt mit einem Fehler. Für Beispiele ohne eigene Daten gibt es zusätzlich den gehosteten Beispiel-Datensatz DTAD:24545281 (Bau-Paket) — jeder gültige Key darf ihn abrufen, die Extraktions-Beispiele dieser Seite laufen damit unverändert per Copy & Paste. Kein Termin, keine Freigabe nötig.

Rezepte — komplette Wege, Schritt für Schritt

Referenz sagt was geht, Rezepte zeigen wie du ans Ziel kommst. Alle Antworten unten sind echt (gekürzt).

Rezept 1: Eigene Dokumente einreichen und verstehen (der Normalfall)

Für alle, die Prüfprotokolle, Rechnungen, Lieferscheine, Bescheinigungen oder Zeugnisse verarbeiten wollen.

1
Dokument als base64 einreichen (v1: PDF + GAEB, max. 10 Dok./15 MB):
curl -X POST https://di.api.1885.cloud/v1/dokumente -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"dokumente": [{"filename": "pruefprotokoll.pdf", "content_base64": "'$(base64 -w0 pruefprotokoll.pdf)'"}]}'
2
Antwort lesen (echt, gekürzt — ein Hilti-Prüfprotokoll):
{"dokumenttyp": "geraetepruefprotokoll", "triage": "AUTO",
 "evidenz": "Prüf- und Messprotokoll Wiederholungsprüfung …",
 "weiterverarbeitung": {"status": "geplant", "hinweis": "DGUV-V3-/VDE-0701-0702-Prüfprotokolle: Gerätedaten, Sicht-/Mess-/Funktionsprüfung, Grenzwerte, nächster Prüftermin …"}}
Erkannt werden u. a. geraetepruefprotokoll, rechnung, lieferschein (inkl. Wiegeschein), bescheinigung_nachweis (Zertifikate/Zeugnisse/Qualifikationen) und alle Bau-Klassen. Zusätzlich liefert jedes Dokument ein Regions-Manifest (regionen): je Seite der Inhalts-Mix (Text/Tabelle/Bild/Vektor-Zeichnung) mit typisierten Blöcken samt Bbox — damit ihr (und Agenten) wisst, was wo steht, bevor irgendetwas extrahiert wird. weiterverarbeitung.status sagt ehrlich, ob die Extraktion dafür schon produktiv ist oder als Pack geplant (Onboarding: Beispieldokumente an uns → Schema + Prüfregeln + Goldset).
3
Bei status: produktiv direkt weiter zum genannten endpoint — und nach triage verzweigen: AUTO-Werte nutzen (Prüfquellen stehen dran), HITL liegt automatisch in der Review-Queue, NOT_FOUND heißt ehrlich: steht nicht im Dokument.

Rezept 1b: Extraktion mit Fundstelle + Prüfquellen (am gehosteten Beispiel)

1
Feld-Extraktion (erst schmal, dann breit) — am Beispiel-Datensatz:
curl -X POST https://di.api.1885.cloud/v1/extract -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"tender_ref": "DTAD:24545281", "fields": ["procurement_number", "binding_deadline"]}'
Antwort (echt): {"triage":"AUTO","consensus_value":"A0161100001","validation_sources":[{"typ":"format_regel","regel_id":"autobahn_az_familien","konform":true}],…} — genau so sehen künftig auch Rechnungs- und Protokoll-Extraktionen aus: Wert + Fundstelle (Datei/Seite/Bbox) + Prüfquellen (z. B. IBAN-Prüfsumme, VDE-Grenzwert) + Triage.

Rezept 1c: Rechnung prüfen — PDF, XRechnung/ZUGFeRD oder Scan

Ein Endpoint für alle drei Fälle; die Antwort sagt in lesequelle ehrlich, welcher Weg gelesen hat (text_schicht / xrechnung_ubl|cii / zugferd_* / ocr_mistral).

0
Ohne eigene Daten starten: GET /v1/beispiele/rechnung liefert eine Muster-XRechnung als fertiges Payload-Fragment — direkt in Schritt 1 einsetzen. Und statt alles selbst zu schreiben: curl -H "Authorization: Bearer $KEY" -o di1885.py https://di.api.1885.cloud/v1/sdk/python — Mini-SDK (eine Datei, keine Abhängigkeiten) mit pruefung(), pruefung_async(), Retry und Fehler-Codes eingebaut.
1
Rechnung einreichen (PDF, DOCX oder XRechnung-/ZUGFeRD-XML):
curl -X POST https://di.api.1885.cloud/v1/pruefung -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename": "rechnung.xml", "content_base64": "'$(base64 -w0 rechnung.xml)'"}'
Oder in Python:
import base64, requests
r = requests.post("https://di.api.1885.cloud/v1/pruefung",
    headers={"Authorization": f"Bearer {KEY}"},
    json={"filename": "rechnung.pdf",
          "content_base64": base64.b64encode(open("rechnung.pdf","rb").read()).decode()})
for p in r.json()["punkte"]:
    print(p["ampel"], p["feld"], "—", p.get("rechtsgrundlage",""))
Je Prüfpunkt: Ampel + Rechtsgrundlage + wörtliche Fundstelle. E-Rechnungen werden deterministisch aus dem XML gelesen (Prüfpunkt en16931_format), Scans laufen automatisch durch OCR.
2
Batch? Asynchron einreichen und Ergebnis abholen:
POST /v1/pruefung  {"filename": ..., "content_base64": ..., "modus": "async"}
→ 202 {"job_id": "<uuid>", "polling_url": "/v1/jobs/<uuid>"}
GET /v1/jobs/<uuid>  → {"status": "fertig", "ergebnis": { ... komplette Antwort ... }}
Optional webhook_url (https) + webhook_secret: bei Job-Ende kommt ein POST mit X-1885-Signature: sha256=<hmac> — Signatur prüfen, Polling bleibt der Vertrag.

Rezept 2: Zweifelsfälle abarbeiten (Prüfer-Workflow)

1
Offene Fälle holen:
curl -H "Authorization: Bearer $KEY" "https://di.api.1885.cloud/v1/review?status=offen&limit=10"
Je Eintrag: Vorschlag + Fundstelle + Grund + alle Lesungen nebeneinander.
2
Übernehmen und entscheiden:
curl -X POST https://di.api.1885.cloud/v1/review/claim -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" -d '{"id": "<uuid>", "bearbeiter": "anna.p"}'
curl -X POST https://di.api.1885.cloud/v1/review/entscheid -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "<uuid>", "bearbeiter": "anna.p", "entscheidung": "bestaetigt"}'
Doppel-Claim wird mit 409 abgewiesen; jede Entscheidung wächst automatisch ins Goldset (sichtbar in GET /v1/review/metrik).
3
Optional per Webhook statt Polling — Payload (echt):
POST <eure URL>  ·  Header: X-1885-Signature: sha256=<hmac>
{"ereignis": "neue_eintraege", "tender_ref": "DTAD:24545281", "anzahl": 2,
 "eintraege": [{"id": "<uuid>", "field_key": "contract_penalty", "grund": "Lesungen divergieren: …"}]}
Signatur prüfen: hmac_sha256(secret, raw_body) == header. Registrierung aktuell über Auriga.

Rezept 3: Eine Scan-Seite bauen (Upload beliebiger Unterlagen)

1
Dokument hochladen (v1: PDF + GAEB, max. 10 Dok./15 MB):
curl -X POST https://di.api.1885.cloud/v1/dokumente -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"dokumente": [{"filename": "gutachten.pdf", "content_base64": "<base64>"}]}'
2
Antwort auswerten: dokumenttyp + weiterverarbeitung.endpoint sagen dir, welchen Aufruf du als nächstes machst; UNBEKANNT zeigst du dem Nutzer als ehrliche Auskunft mit Onboarding-Hinweis.
3
Werte anzeigen mit Beleg: jede fundstelle trägt Datei/Seite/bbox (normiert 0..1) — damit highlightest du die Stelle im PDF-Viewer (Klick auf Wert → Beleg).

Antwort-Prinzipien (gelten überall)

Fehler — Ursache und Lösung

Gateway-Fehler sind application/problem+json mit maschinenlesbarem code — verzweigt im Client auf code, nie auf den Text.

HTTPcodeWannSo löst ihr es
401key_ungueltigSchlüssel fehlt oder ungültigHeader prüfen: Authorization: Bearer $KEY (Leerzeichen, kein Zeilenumbruch). Neuer Schlüssel: Auriga.
403produkt_scope_fehlt / route_scope_fehltSchlüssel ohne Freischaltung für dieses Produkt/diese RouteFreischaltung bei Auriga anfragen (Schlüssel sind je Produkt gescopet).
403 error code: 1010 (Text, kein JSON)Cloudflare Browser-Check blockt den Standard-User-Agent mancher HTTP-Bibliotheken (z. B. Python-urllib)Einen eigenen User-Agent-Header setzen (z. B. meine-app/1.0) — kommt die Antwort als JSON mit title, ist es unsere API; kommt nackter Text error code: 1010, ist es der Browser-Check davor.
404route_unbekanntRoute unbekanntPfad gegen diese Seite / openapi.json prüfen.
405methode_nicht_erlaubtfalsche HTTP-MethodePOST vs. GET beachten (siehe Aufgaben oben).
429rate_limitRatelimit des Keys erreicht (Sandbox: 60/min)Retry-After-Header (Sekunden) abwarten, dann wiederholen — nicht hämmern. Mehr Budget: Produktiv-Key via developer.1885.cloud.
422/400— (Engine: detail)tender_ref fehlt oder unbekanntFormat "DTAD:<id>"; die Ausschreibung muss in der Auriga-Ablage liegen.
5xxkey_dienst_fehler o. —Engine-Neustart oder ÜberlastMit Backoff wiederholen (30–60 s); hält es an: Auriga informieren.

Für Agenten — finden, verstehen, integrieren ohne Menschen

Betrieb & Verlässlichkeit

Schlüssel & Verwaltung

Zentrale Verwaltung über Unkey (Workspace „Auriga Strategy“): pro Nutzer/Partner/Agent ein eigener Schlüssel mit Produkt-Scope, einzeln sperrbar. Antrag: Formular auf developer.1885.cloud — Genehmigung und Erzeugung laufen zentral im Admin-Bereich. Verwendung immer als Authorization: Bearer <KEY>, Ablage als Umgebungsvariable/Secret.

Auriga Strategy · developer.1885.cloud · Base-URL https://di.api.1885.cloud — die bisherige Adresse di.1885.cloud bleibt dauerhaft gültig (Übergangs-Alias: api.1885.cloud) · Status · Changelog · Stand 15.07.2026