NOT_FOUND/not_checkable ausgewiesen. Produktiv extrahiert heute: Bau-Packs; weitere Dokumentklassen erkennt die API bereits und nennt ehrlich ihren Status.POST /mcp — Details in Für Agenten.export KEY=...curl -H "Authorization: Bearer $KEY" https://di.api.1885.cloud/healthAntwort (echt):
{"ok":true,"rules_origin":"db","rules_active":14}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.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
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.
Referenz sagt was geht, Rezepte zeigen wie du ans Ziel kommst. Alle Antworten unten sind echt (gekürzt).
Für alle, die Prüfprotokolle, Rechnungen, Lieferscheine, Bescheinigungen oder Zeugnisse verarbeiten wollen.
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)'"}]}'{"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).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.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.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).
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.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.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.curl -H "Authorization: Bearer $KEY" "https://di.api.1885.cloud/v1/review?status=offen&limit=10"Je Eintrag: Vorschlag + Fundstelle + Grund + alle Lesungen nebeneinander.
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).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.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>"}]}'dokumenttyp + weiterverarbeitung.endpoint sagen dir, welchen Aufruf du als nächstes machst; UNBEKANNT zeigst du dem Nutzer als ehrliche Auskunft mit Onboarding-Hinweis.fundstelle trägt Datei/Seite/bbox (normiert 0..1) — damit highlightest du die Stelle im PDF-Viewer (Klick auf Wert → Beleg).not_checkable/NOT_FOUND zurück.validation_sources dokumentiert, welche Instanz den Wert bestätigt oder verletzt hat — Konsens, Format-Regel (mit Norm-Zitat, z. B. ISO 7064) oder Plausibilität. AUTO gibt es nur mit mindestens einer bestätigenden Quelle; eine verletzte harte Regel schickt das Feld zu REVIEW./v1/extract ohne fields und Flächenläufe brauchen Minuten — Client-Timeout entsprechend setzen (≥ 300 s) — oder /v1/pruefung asynchron aufrufen (modus: async): 202 mit job_id + polling_url (GET /v1/jobs/<id>), optional signierter Webhook.Gateway-Fehler sind application/problem+json mit maschinenlesbarem code — verzweigt im Client auf code, nie auf den Text.
| HTTP | code | Wann | So löst ihr es |
|---|---|---|---|
| 401 | key_ungueltig | Schlüssel fehlt oder ungültig | Header prüfen: Authorization: Bearer $KEY (Leerzeichen, kein Zeilenumbruch). Neuer Schlüssel: Auriga. |
| 403 | produkt_scope_fehlt / route_scope_fehlt | Schlüssel ohne Freischaltung für dieses Produkt/diese Route | Freischaltung 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. |
| 404 | route_unbekannt | Route unbekannt | Pfad gegen diese Seite / openapi.json prüfen. |
| 405 | methode_nicht_erlaubt | falsche HTTP-Methode | POST vs. GET beachten (siehe Aufgaben oben). |
| 429 | rate_limit | Ratelimit 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 unbekannt | Format "DTAD:<id>"; die Ausschreibung muss in der Auriga-Ablage liegen. |
| 5xx | key_dienst_fehler o. — | Engine-Neustart oder Überlast | Mit Backoff wiederholen (30–60 s); hält es an: Auriga informieren. |
GET /v1/stories (ohne Key) — der Story-Katalog sagt, WAS für WEN die API liest und ob es produktiv ist. Nie eine Fähigkeit versprechen, die dort nicht produktiv gelistet ist; Fehlendes per POST /v1/stories/wunsch bestellen.POST /mcp — die Tools spiegeln die Routen inkl. Beschreibungen. Konfiguration:
{ "mcpServers": { "1885-di": {
"type": "http",
"url": "https://di.api.1885.cloud/mcp?apiKey=<KEY>" } } }not_checkable respektieren (nicht auffüllen); lange Läufe (/v1/extract) asynchron einplanen.?format=json)./v1/dokumente-Aufruf. Ratelimit-Vertrag: Sandbox-Keys 60 Anfragen/Minute — darüber 429 mit Retry-After-Header (code rate_limit): so lange warten, dann wiederholen. Produktiv-Keys ohne hartes Limit (fair use); derselbe 429-Vertrag gilt, sobald ein Limit konfiguriert wird. Bei 5xx: Backoff 30–60 s.POST /v1/pruefung nimmt einen Idempotency-Key-Header an: gleicher Key + gleicher Body → gespeicherte Antwort erneut (Header Idempotency-Replayed: true, im Async-Fall dieselbe job_id); gleicher Key + anderer Body → 422. Fenster 48 h. Empfohlen für jeden Retry — kein Dokument wird doppelt geprüft./v2/...): Ankündigung im Changelog, ab dann Deprecation- und Sunset-Header auf den Alt-Routen, mindestens 6 Monate Parallelbetrieb; /v1 bleibt dabei bedienbar.job_id. Verbindliche Aufbewahrungs-/GoBD-Zusagen: über Auriga anfragen.GET /v1/jobs/<id> exportieren; Löschung aller Job-Ergebnisse auf Zuruf. Es gibt keinen Lock-in: alle Daten, die ihr uns gabt, habt ihr selbst — wir halten nur Prüfergebnisse.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