BIQE API
Integrieren Sie Handschriftenerkennung mit LLM-Korrektur direkt in Ihre eigene Pipeline. REST-basiert, JSON-Antworten, Authentifizierung per API-Schlüssel.
Die BIQE-API ist für den Produktiveinsatz gedacht: Sie reichen Seiten programmatisch ein, verfolgen den Status und rufen das Ergebnis ab — ohne das Portal zu öffnen. Die Verarbeitung durchläuft dieselbe Kette wie im Portal (Layout-Erkennung, Erkennung, LLM-Korrektur, Export nach PageXML/ALTO/PDF).
Authentifizierung
Jede Anfrage authentifiziert sich mit einem API-Schlüssel. Sie können den Schlüssel im X-API-Key-Header oder in einem Authorization: Bearer-Header übergeben — beide werden akzeptiert. Der Verkehr läuft über verschlüsseltes HTTPS.
X-API-Key: biqe_live_xxxxxxxxxxxxxxxxxxxxxxxx # oder, gleichwertig: Authorization: Bearer biqe_live_xxxxxxxxxxxxxxxxxxxxxxxx
Behandeln Sie Schlüssel wie Passwörter. Niemals in die Versionsverwaltung einchecken und nicht per E-Mail oder Chat teilen. Bewahren Sie sie in einem Secret Manager auf. Rotieren Sie sie routinemäßig alle 90 Tage und sofort bei Verdacht auf Offenlegung.
API-Schlüssel verwalten
Schlüssel erstellen und verwalten Sie selbst im Kundenportal unter Einstellungen ▸ API-Schlüssel ▸ + Neuer API-Schlüssel. Geben Sie dem Schlüssel eine Bezeichnung. Der Wert wird bei der Erstellung einmalig angezeigt — danach kann er nicht erneut angezeigt werden. Das Widerrufen erfolgt auf derselben Seite und wirkt sofort.
Einen Scan einreichen
Reichen Sie Seiten als ZIP-Archiv ein (ein Bild pro Seite), im Multipart-Feld scan_zip. Optional übergeben Sie eine Verarbeitungsstufe, ein Preset und eine Webhook-URL.
curl -X POST https://ocr-handwriting.online/v1/process-scan \ -H "X-API-Key: $BIQE_API_KEY" \ -F "scan_zip=@my-pages.zip" \ -F "llm_tier=balanced" \ -F "preset=generic_historical" \ -F "webhook_url=https://your-system.example/biqe-callback"
Antwort — 202 Accepted:
{
"job_id": "ff6f3db8-ab61-47d0-9f69-1987b5b0f2f0",
"state": "queued",
"page_count": 14,
"created_at": "2026-05-02T11:56:05Z",
"expires_at": "2026-05-09T11:56:05Z",
"status_url": ".../v1/process-scan/ff6f3db8-...",
"result_url": ".../v1/process-scan/ff6f3db8-.../result"
}
Passwortgeschützte ZIP-Dateien werden abgelehnt. Nutzen Sie die status_url aus der Antwort, um den Fortschritt zu verfolgen.
Den Auftragsstatus verfolgen
Fragen Sie den Status ab oder warten Sie auf den Webhook-Callback (empfohlen für größere Mengen).
curl https://ocr-handwriting.online/v1/process-scan/<job_id> \ -H "X-API-Key: $BIQE_API_KEY"
Antwort (Felder je nach Fortschritt):
{
"job_id": "ff6f3db8-...",
"state": "done",
"page_count": 14,
"current_step": "export",
"created_at": "2026-05-02T11:56:05Z",
"started_at": "2026-05-02T11:56:09Z",
"finished_at": "2026-05-02T11:57:43Z",
"expires_at": "2026-05-09T11:56:05Z",
"error_message": null,
"warning_message": null,
"result_url": ".../v1/process-scan/ff6f3db8-.../result"
}
Der Auftrag ist erst beim Status done fertig — nicht complete. Das Feld result_url erscheint erst, sobald der Status done ist.
Das Ergebnis abrufen
Sobald der Status done ist, laden Sie über diesen Endpunkt (oder die result_url) das Ergebnis-Archiv herunter: PageXML, ALTO und — falls aktiviert — eine durchsuchbare PDF. Der Link bleibt etwa 7 Tage verfügbar (siehe expires_at).
curl -L https://ocr-handwriting.online/v1/process-scan/<job_id>/result \ -H "X-API-Key: $BIQE_API_KEY" \ -o result.zip
Einen Auftrag abbrechen
Ein Auftrag, der noch in der Warteschlange steht oder verarbeitet wird, kann abgebrochen werden. Der Status wechselt dann zu cancelled.
curl -X DELETE https://ocr-handwriting.online/v1/process-scan/<job_id> \ -H "X-API-Key: $BIQE_API_KEY"
Webhook-Callback & Retries
Übergeben Sie eine webhook_url, senden wir einen POST mit JSON, sobald der Auftrag einen Endzustand erreicht (done oder failed). Der Callback enthält diese Header:
| Header | Inhalt |
|---|---|
Content-Type | application/json |
X-BIQE-Event | Ereignistyp, z. B. job.completed. |
X-BIQE-Signature | HMAC-SHA256-Signatur des Bodys (siehe unten). |
Die Payload:
{
"job_id": "ff6f3db8-...",
"state": "done",
"page_count": 14,
"result_url": ".../v1/process-scan/ff6f3db8-.../result"
}
result_url ist nur vorhanden, wenn state gleich done ist. Fehlgeschlagene Zustellungen werden bis zu fünfmal mit exponentiellem Back-off wiederholt (etwa 1, 5, 25, 125 und 625 Sekunden). Ihr Endpunkt sollte möglichst schnell ein 2xx zurückgeben und über HTTPS erreichbar sein.
Die Webhook-Signatur prüfen
Jeder Callback ist signiert. Die Signatur ist ein HMAC-SHA256 über den rohen Request-Body, mit Ihrem kontospezifischen Webhook-Secret als Schlüssel, als Kleinbuchstaben-Hex im Header X-BIQE-Signature. Das Secret (64 Hex-Zeichen) ist kundenspezifisch; rufen Sie es über das Portal ab.
import hmac, hashlib secret = "<your-webhook-secret>".encode() body = request.get_data() # raw bytes expected = hmac.new(secret, body, hashlib.sha256).hexdigest() if not hmac.compare_digest(expected, request.headers["X-BIQE-Signature"]): return "forbidden", 403
Berechnen Sie die Signatur über die rohen Body-Bytes, vor dem Parsen. Erneutes Serialisieren ändert die Bytes und lässt die Prüfung fehlschlagen.
Auftragsstatus
| Status | Bedeutung |
|---|---|
| queued | Angenommen; wartet auf einen Verarbeiter. |
| processing | Seiten werden verarbeitet (siehe current_step). |
| done | Alle Seiten erfolgreich; result_url ca. 7 Tage verfügbar. |
| failed | Kritische Fehler. Nicht berechnet. Siehe error_message. |
| cancelled | Vom Kunden per DELETE abgebrochen. |
Parameter von process-scan
| Feld | Erforderlich | Beschreibung |
|---|---|---|
scan_zip | ja | ZIP mit einem Bild pro Seite (ohne Passwort). |
llm_tier | nein | cheap, balanced (Standard) oder best. |
preset | nein | Dokumenttyp für die Korrektur, z. B. generic_historical. |
webhook_url | nein | HTTPS-URL für den Callback. Leer = kein Callback. |
pipeline_steps | nein | Auszuführende Schritte; Standard all. |
pdf_format | nein | Format der durchsuchbaren PDF; Standard pdfa-2b. |
Fehlerbehandlung
| Code | Bedeutung |
|---|---|
202 | Anfrage angenommen; Auftrag in Warteschlange. |
200 | Status abgerufen (GET). |
401 | Fehlender/ungültiger Schlüssel. |
400 | Ungültige Eingabe (z. B. passwortgeschützte ZIP). |
404 | Unbekannte job_id. |
Fehlgeschlagene Aufträge (failed) werden nicht berechnet. Prüfen Sie im Zweifel den Status via GET /v1/process-scan/<job_id> oder im Portal.