API-Dokumentation

Binden Sie EqualDoX in Ihre eigenen Systeme ein: PDF hochladen, Status abfragen, barrierefreies PDF und Diagnose herunterladen.

Überblick

Die REST API v1 automatisiert, was Sie aus der Weboberfläche kennen: Sie senden ein PDF, EqualDoX bereitet es asynchron barrierefrei auf, und Sie laden das Ergebnis mit einer strukturierten Diagnose herunter.

Die API steht Organisationskonten zur Verfügung. Jede Anfrage gehört zu einer Person und einer Gruppe Ihrer Organisation. Es gelten dieselben Regeln wie in der Weboberfläche: dieselbe Prüfung des Uploads, dieselben Seitenkontingente und Preise, dieselbe Aufbewahrung. API-Aufträge erscheinen im Dashboard bei der Person und Gruppe, die sie eingereicht hat.

  • JSON über HTTPS, das PDF als Anfragekörper
  • Asynchron: Status abfragen statt Webhooks
  • Diagnose je Auftrag: Ergebnis, Seiten, Befunde
  • Sichere Wiederholungen mit Idempotency-Key
  • Seitenverbrauch von Weboberfläche und API zusammen

Authentifizierung

Erstellen Sie einen Schlüssel im Dashboard unter Konto › API-Schlüssel: einen je Gruppe, in der Sie PDFs einreichen dürfen. Der Schlüssel wird nur einmal angezeigt; bewahren Sie ihn sicher auf.

Basis-URL
https://equaldox.de/api/v1
Header
Authorization: Bearer eqx_…
Schlüssel testen: Seitenverbrauch des laufenden Monats
curl -sS --fail-with-body https://equaldox.de/api/v1/usage \
  -H "Authorization: Bearer $EQUALDOX_API_KEY"

Regeln für Schlüssel

  • Ein Schlüssel gehört zu Ihnen und einer Gruppe: Aufträge werden unter dieser Gruppe eingereicht, und der Schlüssel sieht nur Ihre Aufträge darin. Für eine andere Gruppe verwenden Sie deren Schlüssel.
  • Neu erzeugen oder widerrufen wirkt sofort. Je Person sind höchstens fünf neue Schlüssel in 24 Stunden möglich.
  • Ein Schlüssel verliert seine Gültigkeit, wenn Ihre Mitgliedschaft endet, Sie die Gruppe verlassen oder die Organisation nicht mehr aktiv ist.
  • Verwenden Sie den Schlüssel nur auf Ihrem Server, nicht in Browser-Code, Apps oder Repositories. Aufrufe aus Webseiten anderer Domains werden nicht unterstützt.
  • Neue AGB nehmen Sie zuerst im Dashboard an; bis dahin antwortet die API mit 403.

Schnellstart

Die Verarbeitung läuft asynchron: Das Hochladen legt einen Auftrag an, den Sie abfragen, bis job.status den Wert DONE oder FAILED hat. Warten Sie nicht auf diagnostics.outcome.final; es zeigt nur, ob sich die Diagnose noch ändern kann.

Bash-Skript: hochladen, abfragen, herunterladen, löschen
#!/usr/bin/env bash
# Voraussetzungen: curl 7.76+ und jq; vorher: export EQUALDOX_API_KEY="eqx_…"
set -euo pipefail
BASE="https://equaldox.de/api/v1"
AUTH="Authorization: Bearer $EQUALDOX_API_KEY"
FILE="jahresbericht-2026.pdf"
IDEM_KEY="jahresbericht-2026-$(date +%Y%m%d%H%M%S)"         # Ihre eigene ID für diesen Upload
NAME=$(jq -rn --arg f "$(basename "$FILE")" '$f|@uri')    # Dateiname URL-kodieren

# 1. Hochladen; nach einem Verbindungsabbruch dieselbe Anfrage mit demselben IDEM_KEY wiederholen
JOB=$(curl -sS --fail-with-body -X POST "$BASE/jobs" -H "$AUTH" \
  -H "Content-Type: application/pdf" \
  -H "X-Upload-Filename: $NAME" \
  -H "Idempotency-Key: $IDEM_KEY" \
  --data-binary "@$FILE") || { echo "$JOB" >&2; exit 1; }
JOB_ID=$(jq -r '.job.id' <<< "$JOB")

# 2. Status abfragen, bis job.status DONE oder FAILED ist
while :; do
  JOB=$(curl -sS --fail-with-body "$BASE/jobs/$JOB_ID" -H "$AUTH") || { echo "$JOB" >&2; exit 1; }
  STATUS=$(jq -r '.job.status' <<< "$JOB")
  echo "Status: $STATUS"
  case "$STATUS" in DONE|FAILED) break ;; esac
  sleep 10
done

# 3. Ergebnis herunterladen (--fail schreibt keine Fehlerantwort in die Datei)
if [ "$(jq -r '.job.result_available' <<< "$JOB")" = true ]; then
  curl -sS --fail -o "${FILE%.pdf}_barrierefrei.pdf" "$BASE/jobs/$JOB_ID/result" -H "$AUTH"
else
  jq '.job.diagnostics.failure' <<< "$JOB"   # FAILED: error_code und action
fi

# 4. Optional: Auftrag und Dokumente sofort löschen (sonst nach 7 Tagen)
curl -sS --fail-with-body -X DELETE "$BASE/jobs/$JOB_ID" -H "$AUTH"
  • 1. Hochladen PDF als Anfragekörper, Dateiname URL-kodiert in X-Upload-Filename (Endung .pdf).
  • 2. Abfragen Alle 10 Sekunden; erlaubt sind 60 Anfragen pro Minute und Person.
  • 3. Herunterladen Nur bei result_available: true; --fail speichert keine Fehlerantwort als PDF.
  • 4. Löschen Optional; sonst automatisch 7 Tage nach dem Upload.

API-Referenz

Alle Pfade beziehen sich auf https://equaldox.de. Antworten sind JSON mit "status": "ok", außer dem PDF-Download. Alle Felder und Schemas beschreibt die OpenAPI-3.1-Spezifikation (JSON).

Endpunkte der API v1
Endpunkt Zweck Wichtige Parameter Antwort
POST /api/v1/jobs PDF hochladen, Konvertierung starten Body: PDF; Header Content-Type, X-Upload-Filename, optional Idempotency-Key 201 job (Wiederholung 200)
GET /api/v1/jobs Aufträge auflisten, neueste zuerst limit 1–100 (Standard 50), offset jobs, total
GET /api/v1/jobs/{id} Status, Seiten, Abrechnung, Kurzdiagnose keine job
GET /api/v1/jobs/{id}/diagnostics Diagnose mit Befunden je Seite keine job_id, diagnostics
GET /api/v1/jobs/{id}/result Barrierefreies PDF herunterladen keine application/pdf
DELETE /api/v1/jobs/{id} Auftrag und Dokumente löschen keine job_id, deleted
GET /api/v1/usage Berechnete Seiten je Zeitraum from, to (YYYY-MM-DD, beide oder keiner; Standard: laufender Monat) usage

Ein Schlüssel sieht nur Ihre eigenen Aufträge in seiner Gruppe, auch die dort über die Weboberfläche hochgeladenen; jeder andere Auftrag antwortet mit 404. Zeitangaben sind UTC im Format ISO 8601.

Antwort von GET /api/v1/jobs/{id} (gekürzt)
{
  "status": "ok",
  "job": {
    "id": "3f6c2a1e-8b0d-4c55-9a77-1d2e3f4a5b6c",
    "status": "DONE",
    "filename": "jahresbericht-2026.pdf",
    "page_count": 24,
    "expires_at": "2026-11-16T09:00:00Z",
    "result_available": true,
    "error_code": null,
    "billing": {"pages_reserved": 24, "pages_charged": 24,
                "settled": true, "failed_pages": []},
    "links": {"result": "/api/v1/jobs/3f6c2a1e-…/result"},
    "diagnostics": {
      "outcome": {"state": "succeeded", "final": true},
      "pages": {"total": 24, "converted": 24, "failed": []},
      "failure": null
    }
  }
}

Wichtige Felder des Auftrags

status
UPLOADED, PROCESSING, DONE oder FAILED
result_available, links.result
Das PDF kann heruntergeladen werden
expires_at
Zeitpunkt der automatischen Löschung
error_code
Grund bei FAILED
billing
Reservierte und berechnete Seiten
diagnostics
Kurzdiagnose, nur bei GET /api/v1/jobs/{id}

Wichtige Details für die Integration

  • Dateiformat und Größe

    Nur PDF, bis 50 MB (52.428.800 Byte), als Anfragekörper mit Content-Type: application/pdf. Dateiname URL-kodiert in X-Upload-Filename, Endung .pdf, höchstens 255 Zeichen. Leere, beschädigte und passwortgeschützte PDFs: 422.

  • Anfragelimit

    60 Anfragen pro Minute je Person, über alle Schlüssel. Darüber folgt 429 mit Retry-After (Sekunden): so lange warten, dann wiederholen. Einzelne Aufträge höchstens alle 5 Sekunden abfragen, viele gemeinsam über GET /api/v1/jobs.

  • Idempotenz und Wiederholung

    Je Upload einen eigenen Idempotency-Key senden (1–255 sichtbare ASCII-Zeichen). Die identische Wiederholung liefert denselben Auftrag (200, Idempotency-Replayed: true), ohne zweite Abrechnung. Gültig 24 Stunden je Person; andere Datei oder anderer Name: 409. Nach FAILED einen neuen Schlüssel verwenden.

  • Status und Ergebnis

    UPLOADED, PROCESSING, dann endgültig DONE oder FAILED. Das PDF steht bereit, sobald result_available true ist. Die API liefert das aufbereitete PDF; eine später in der Prüfansicht korrigierte Fassung gibt es im Dashboard.

  • Aufbewahrung und Löschung

    Automatische Löschung 7 Tage nach dem Upload (expires_at), danach 404. DELETE löscht früher, auch während der Verarbeitung; dann werden keine Seiten berechnet. Verlängerung auf 30 Tage im Dashboard.

  • Seitenkontingent und Abrechnung

    Kontingent und Preise Ihrer Organisation wie in der Weboberfläche, ohne API-Aufpreis. Seiten werden beim Upload reserviert und nach Abschluss berechnet, fehlgeschlagene Seiten und FAILED-Aufträge nicht. Zu wenige Seiten: 409. Verbrauch je Tag: GET /api/v1/usage.

Diagnose

Jeder Auftrag enthält eine Kurzdiagnose in diagnostics: outcome (Gesamtergebnis), pages (gesamt, konvertiert, fehlgeschlagen) und bei FAILED failure mit action. GET …/diagnostics ergänzt die einzelnen Befunde: Fehler, Warnungen und Hinweise mit Seite und Code.

Die Befunde stammen aus der automatischen Prüfung des aufbereiteten PDFs, die auch die Prüfansicht im Dashboard zeigt. EqualDoX verwendet dafür einen eigenen Barrierefreiheits-Validator. Er ist darauf ausgelegt, alle Barrierefreiheitsverstöße zu erkennen, die veraPDF und PAC erkennen können. Die Diagnose ist ein technisches Prüfergebnis, keine Zertifizierung und keine rechtliche Bewertung.

Werte von outcome.state

pending
Der Auftrag wird noch verarbeitet
checking
Konvertiert, die Prüfung läuft noch
succeeded
Konvertiert, ohne gemeldete Fehler oder Warnungen
succeeded_with_warnings
Konvertiert, Warnungen ansehen
review_required
Mindestens ein Fehler, in der Prüfansicht prüfen
failed
Konvertierung fehlgeschlagen, siehe failure.action

outcome.final zeigt nur, ob sich die Diagnose noch ändern kann. Ob ein Auftrag abgeschlossen ist, entscheidet job.status.

Fehlerbehandlung

Fehler sind JSON: {"status": "error", "error": "<code>"}, bei ungültigen Eingaben zusätzlich fields mit Feld und Grund. Unverändert wiederholen sollten Sie nur idempotency_request_in_progress, 429 und 5xx; alle anderen Fehler brauchen eine geänderte Anfrage oder eine Aktion im Dashboard.

HTTP-Status, Fehlercodes und was zu tun ist
Status Fehlercodes Was tun
401 api_key_required, invalid_api_key Genau einen Header Authorization: Bearer … senden. Schlüssel ungültig, widerrufen oder neu erzeugt: im Dashboard einen neuen erstellen.
403 terms_acceptance_required, processing_restricted Neue AGB im Dashboard annehmen. Bei eingeschränkter Verarbeitung an uns wenden.
404 not_found, result_not_available Auftrag unbekannt, gelöscht, abgelaufen oder nicht sichtbar. Kein Ergebnis: auf DONE warten; FAILED hat keins.
405, 413, 415, 422 method_not_allowed, payload_too_large, unsupported_media_type, validation_failed Anfrage korrigieren. Bei 422 nennt fields den Grund, z. B. file: password_protected oder filename: not_pdf_extension.
409 page_quota_exceeded, member_page_limit_exceeded Zu wenige Seiten (pages_required, pages_remaining): Seiten kaufen oder die Verwaltung Ihrer Organisation fragen.
409 dpa_required, dpa_update_required, organization_not_active, upload_group_unavailable Konto nicht bereit für Uploads: Auftragsverarbeitungsvertrag (AVV) oder seine Aktualisierung im Dashboard annehmen, Organisation und Gruppe prüfen.
409 idempotency_key_reused, idempotency_request_in_progress Schlüssel anders verwendet: einen neuen nehmen. Erste Anfrage läuft noch: nach Retry-After wiederholen.
429 rate_limited Retry-After Sekunden warten, dann wiederholen.
500, 503 server_error, processing_unavailable, storage_unavailable, storage_locked, uploads_disabled Vorübergehend: später mit wachsenden Abständen wiederholen, Uploads mit demselben Idempotency-Key.

Eine fehlgeschlagene Konvertierung ist kein HTTP-Fehler: Der Auftrag endet mit FAILED, und diagnostics.failure.action sagt, was zu tun ist: retry_later (später mit neuem Idempotency-Key erneut hochladen), fix_input (die Datei ist kein verwendbares PDF), contact_support (an uns wenden) oder resubmit (erneut einreichen). FAILED-Aufträge werden nicht berechnet.

Sie möchten EqualDoX in Ihre Abläufe einbinden?

Mit einem Organisationskonto erstellen Sie Ihren API-Schlüssel im Dashboard. Bei Fragen zur Integration helfen wir gern.