Offentliche API

API-Dokumentation

Integriere SotaOCR in deine AI-Agenten und LLM-Pipelines. Die API arbeitet asynchron: Dokument hochladen, Job-Status abfragen und danach das Ergebnis oder bei Bedarf das Seiten-Preview im selben Koordinatensystem wie die OCR-BBoxen abrufen.

Basis-URL

Alle offentlichen OCR-Endpunkte werden von diesem Host bereitgestellt.

https://sotaocr.com

Authentifizierung

Alle API-Anfragen benotigen einen Bearer-Token. Einen API-Schlussel kannst du im Dashboard erstellen.

Header

Authorization: Bearer YOUR_API_KEY

Verfugbare Routen

Der OCR-Dienst stellt API-Routen bereit: /v1/balance, /v1/extract, /v1/jobs/{job_id}, /v1/jobs/{job_id}/result, /v1/jobs/{job_id}/result.html, /v1/jobs/{job_id}/result.docx und /v1/jobs/{job_id}/pages/{page_number}/preview. Frage GET /api/v1/info ab, um model_profiles zu lesen, bevor du model_profile sendest. HTML- und DOCX-Rekonstruktions-Exporte sind fuer FAST- und PRO-Jobs verfuegbar.

OCR-Vorverarbeitung

Vor dem Haupt-OCR erkennt der Dienst automatisch die Seitenausrichtung, rotiert die Seite und wendet bei Bedarf Document Unwarping an. Der erkannte Winkel steht in doc_preprocessor_res.angle, und der Preview-Endpunkt liefert genau das Seitenbild, in dessen Koordinatensystem die OCR-BBoxen liegen.

Polling und Bereitschaft

Frage die API hochstens einmal pro Sekunde ab. Bis OCR fertig ist, liefert GET /v1/jobs/{job_id}/result ein 202 Accepted mit dem Code result_not_ready.

Pro OCR

Wenn das Pro-Modell aktiviert ist, sende model_profile=pro an /v1/extract, um OCR mit hoherer Qualitat zu nutzen. Pro OCR kostet 2 scan pages pro verarbeiteter Dokumentseite.

cURL · Pro-Anfrage
curl -X POST https://sotaocr.com/v1/extract \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@document.pdf" \
  -F 'page_ranges=[{"start":1,"end":5}]' \
  -F "model_profile=pro"
JSON · Antwort
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "pending",
  "page_count": 5,
  "pages_completed": 0,
  "model_profile": "pro",
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:00Z"
}
GET

Seitenguthaben prufen

/v1/balance Liefert das aktuelle scan page Guthaben des authentifizierten Kontos. Verwenden Sie remaining_pages oder total_affordable_pages, um zu entscheiden, wie viele Seiten noch verarbeitet werden konnen.

cURL · Anfrage
curl -X GET https://sotaocr.com/v1/balance \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Antwort
{
  "entity_code": "scan_page",
  "remaining_pages": 63,
  "total_affordable_pages": 63,
  "monthly_pages": {"total": 40, "allocated": 5, "remaining": 35},
  "lifetime_pages": {"total": 20, "allocated": 2, "remaining": 18},
  "tokens": {"total": 120, "allocated": 20, "remaining": 100, "affordable_pages": 10},
  "token_price": 10
}
POST

1. Dokument hochladen

/v1/extract Ladt ein PDF oder Bild fur OCR hoch. Bei Erfolg kommt 202 Accepted mit Job-Metadaten wie account_id, upstream_job_id, created_at und updated_at zuruck.

  • file: Dokumentdatei (PDF, PNG, JPG).
  • page_ranges: (Optional) JSON-String mit einem Array von Seitenbereichen. Beispiel: '[{"start":1,"end":3}]'
  • model_profile: Optionales OCR-Modellprofil. Lass das Feld weg, um den Service-Standard zu verwenden, oder sende einen Wert aus model_profiles von GET /api/v1/info.
cURL · Anfrage
curl -X POST https://sotaocr.com/v1/extract \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@document.pdf" \
  -F 'page_ranges=[{"start":1,"end":5}]'
JSON · Antwort
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "pending",
  "page_count": 5,
  "pages_completed": 0,
  "model_profile": "fast",
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:00Z"
}
GET

2. Status prufen

/v1/jobs/{job_id} Liefert 200 OK mit dem aktuellen Status sowie account_id, upstream_job_id, page_count, pages_completed, created_at und updated_at.

cURL · Anfrage
curl -X GET https://sotaocr.com/v1/jobs/job_123456789 \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Antwort
{
  "id": "job_123456789",
  "account_id": "acct_123456789",
  "status": "completed",
  "page_count": 5,
  "pages_completed": 5,
  "upstream_job_id": "up_job_987654321",
  "created_at": "2026-03-24T12:00:00Z",
  "updated_at": "2026-03-24T12:00:08Z"
}
GET

3. Ergebnis abrufen

/v1/jobs/{job_id}/result?format=markdown Gibt 200 OK mit dem extrahierten Inhalt zurueck, wenn der Job completed ist. Fuer format=json koennen Seiten doc_preprocessor_res mit angle und page_preview-Metadaten fuer den BBox-Koordinatenraum enthalten. format=html gibt rekonstruiertes HTML in der JSON-Huelle zurueck und ist derzeit nur FAST; fuer eine eigenstaendige HTML-Datei mit eingebetteten Bildern nutze /result.html. Vorher antwortet der Endpunkt mit 202 Accepted und dem Code result_not_ready.

  • format: (Optional) Antwortformat: json, markdown, text oder html. Standard ist json. html ist derzeit nur FAST.
cURL · Anfrage
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result?format=markdown" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON · Antwort
{
  "job_id": "job_123456789",
  "format": "json",
  "page_count": 1,
  "content": "{\"job_id\":\"job_123456789\",\"page_count\":1,\"pages\":[{\"page_number\":1,\"status\":\"completed\",\"text\":\"Ivan Matveev\",\"doc_preprocessor_res\":{\"angle\":0,\"model_settings\":{\"use_doc_orientation_classify\":true,\"use_doc_unwarping\":false}},\"page_preview\":{\"coordinate_space\":\"doc_preprocessed\",\"content_type\":\"image/png\",\"width\":1192,\"height\":1684},\"raw_result\":{}}]}"
}
GET

4. Standalone-HTML abrufen

/v1/jobs/{job_id}/result.html Gibt eine text/html-Rekonstruktion mit eingebetteten Data-URI-Bildern fuer FAST- und PRO-Jobs zurueck.

cURL · Anfrage
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result.html" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output result.html
JSON · Antwort
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Disposition: inline; filename="job_123456789.html"

(eigenstaendiges HTML mit eingebetteten Data-URI-Bildern)
GET

5. DOCX-Rekonstruktion abrufen

/v1/jobs/{job_id}/result.docx Gibt eine binaere .docx-Visuelle Rekonstruktion mit eingebetteten Seitenbildern und durchsuchbarem OCR-Text fuer FAST- und PRO-Jobs zurueck.

cURL · Anfrage
curl -X GET "https://sotaocr.com/v1/jobs/job_123456789/result.docx" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output result.docx
JSON · Antwort
HTTP/1.1 200 OK
Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
Content-Disposition: attachment; filename="job_123456789.docx"

(binaere DOCX-Bytes)
GET

6. Seiten-Preview fuer BBox-Overlays abrufen

/v1/jobs/{job_id}/pages/{page_number}/preview Liefert das PNG-Seitenbild nach automatischer Rotation und optionalem Unwarping. Genau dieses Bild solltest du hinter OCR-BBox-Overlays rendern.

cURL · Anfrage
curl -X GET https://sotaocr.com/v1/jobs/job_123456789/pages/1/preview \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --output page_0001_preview.png
JSON · Antwort
HTTP/1.1 200 OK
Content-Type: image/png
Content-Disposition: inline; filename="page_0001_preview.png"

(binare PNG-Daten im selben Koordinatensystem wie die OCR-BBoxen)

API-Fehler

Die meisten Fehlerantworten verwenden {"error":{"code":"...","message":"..."}}. insufficient_balance enthalt zusatzlich entity_code, requested_units und available_units.

  • 400 Ungultige Anfrage: Ungueltiges Multipart, fehlendes file, ungueltige page_ranges oder ungueltiges PDF. Code: bad_request.
  • 401 Nicht autorisiert: Bearer-Token fehlt oder ist ungueltig. Code: unauthorized.
  • 403 Verboten: API-Zugang erforderlich oder Guthaben nicht ausreichend. Codes: api_access_required oder insufficient_balance.
  • 404 Nicht gefunden: Unbekannte job_id oder Zugriff auf einen fremden Job. Code: job_not_found.
  • 415 Nicht unterstutzter Medientyp: Der hochgeladene Dateityp wird nicht unterstutzt. Code: unsupported_media.
  • 502 Upstream nicht verfugbar: OCR-Upstream ist nicht verfugbar oder die Job-Synchronisierung ist fehlgeschlagen. Code: upstream_unavailable.

Bereit zur Integration?

Erstelle einen API-Schlussel im Dashboard und erhalte kostenlose Testseiten.