Auslieferung und Start-SLA
Die Auslieferung steuert client_wait — unabhängig von der Start-SLA processing_lane. Siehe Start-SLA.
Pipeline-Slug
Job-Pfade nutzen handler___command mit drei Unterstrichen. OCR: POST /job/add/paperoffice_aiocr___generate. IDP: POST /job/add/workflow. Kein Punkt und kein po-* im Pfad.
Punkt-Notation (handler.command) liefert HTTP 400 (JOB_CONFIG_INVALID).
IDP POST /job/add/workflow akzeptiert nur Multipart-file oder pofid — keine JSON-URL-Arrays.
Standard — Verbindung halten
POST /job/add/{pipeline} → Verbindung halten bis ~295s → 200 result ODER HTTP 202 + job_id + poll_url
Nach Ablauf des Hold-Fensters läuft der Job weiter. GET /job/get/{job_id} alle 5–10 Sekunden oder poll_url aus der Response verwenden.
Wartende, laufende und abgeschlossene API-Jobs unter Konto → API → Job-Warteschlange (/paperoffice-account/api-queue).
Sofortige job_id
client_wait=false ODER async_only=true
1. POST /job/add/{pipeline} → job_id sofort (~100ms)
2. GET /job/get/{job_id} → Alle 5–10 s pollen, bis job_status = "completed"
3. GET /job/download/{token} → Nur wenn job_result eine Download-URL enthält
HTTP 202 — Job läuft weiter
HTTP 202 ist ein Erfolgspfad, kein Fehler. Der Job bleibt aktiv. job_id und poll_url pollen, bis job_status den Wert completed hat. Das Ergebnis steht in job_result.
Bei Connection Hold steht das fertige Ergebnis in result. Beim Pollen steht es in job_result. Clients werten den stabilen code aus, nicht den lokalisierten message-Text.
Response-Format
Alle Responses sind JSON und enthalten processing_time.
Erfolg:
{
"status": "success",
"job_id": "abc123",
"result": { "text": "…" },
"processing_time": "45.12ms"
}
Polling / HTTP 202:
{
"status": "success",
"job_id": "abc123",
"poll_url": "/job/get/abc123",
"client_wait": false,
"max_wait_seconds": 60,
"message": "Job queued — poll for result",
"processing_time": "45.12ms"
}
Fehler:
{
"status": "error",
"code": "INSUFFICIENT_CREDITS",
"message": "Not enough credits for this job",
"processing_time": "12.04ms"
}
Error-Codes
| HTTP | Code | Bedeutung | Lösung |
|---|---|---|---|
| 400 | INVALID_REQUEST | Fehlende / ungültige Parameter | Request-Body prüfen |
| 400 | JOB_CONFIG_INVALID | Ungültiger Pipeline-Slug | handler___command verwenden, keine Punkt-Notation |
| 401 | AUTH_REQUIRED | Kein Bearer-Token | Authorization: Bearer YOUR_TOKEN setzen |
| 401 | INVALID_TOKEN | Token ungültig | Token-Format prüfen (po_sk_, po_ut_, po_gt_, po_pk_) |
| 401 | BEARERTOKEN_EXPIRED | Token abgelaufen | Neuen Token anfordern |
| 402 | INSUFFICIENT_CREDITS | Credits nicht ausreichend | Credits aufladen oder niedrigere Lane wählen |
| 402 | BUDGET_EXHAUSTED | Publishable-Key-Budget erreicht | Neuen po_pk_ erstellen oder Budget-Cap erhöhen |
| 403 | FORBIDDEN | Aktion nicht erlaubt | Scope, Origin oder Lizenz prüfen |
| 403 | TIER_RESTRICTED | Produkt-API ohne Token (VISITOR) | Bearer-Token setzen — das ist kein HTTP 401 |
| 403 | JOB_REQUIRES_PAID_TIER | Free-Tier unzulässig | Bezahlten Plan verwenden |
| 404 | NOT_FOUND | Nicht gefunden | URL-Pfad prüfen |
| 429 | RATE_LIMIT_EXCEEDED | Zu viele Requests | Retry-After beachten |
| 429 | QUEUE_LIMIT_REACHED | Queue voll | Später erneut senden |
| 500 | INTERNAL_ERROR | Server-Fehler | Nach kurzer Pause erneut versuchen |
| 503 | SERVICE_UNAVAILABLE | Service nicht erreichbar | Mit Backoff erneut versuchen |