Dokumentacja API

Za pomocą API DokuScan przesyłasz dokumenty programowo, pobierasz wyniki i otrzymujesz powiadomienia przez webhook. Dostęp jest częścią pakietu Business.

Spis treści


Przegląd


Uwierzytelnianie

Klucze API tworzysz w aplikacji w sekcji „API i webhooki” (do 5 kluczy). Klucz jest w pełni widoczny tylko podczas tworzenia. Wysyłaj go w każdym żądaniu jako token Bearer lub w nagłówku X-API-Key.

curl https://app.dokuscan.com/api/v1/account \
  -H "Authorization: Bearer dsk_xxxxxxxx" \
  -H "Accept: application/json"

Jeśli brakuje klucza lub jest nieprawidłowy, API odpowiada kodem 401. Jeśli konto nie ma pakietu Business, odpowiada kodem 403.


Przesyłanie dokumentu

POST /scans tworzy skan. Przetwarzanie odbywa się w tle. Wynik pobierzesz przez GET /scans/{id} lub otrzymasz go przez webhook.

Parametr Opis
template_id (wymagany) ID szablonu, zob. GET /templates.
file (wymagany) Plik jako multipart/form-data. PDF, JPG, JPEG lub PNG, do 20 MB.
curl -X POST https://app.dokuscan.com/api/v1/scans \
  -H "Authorization: Bearer dsk_xxxxxxxx" \
  -H "Accept: application/json" \
  -F "template_id=12" \
  -F "file=@lieferschein.pdf"

Odpowiedź przy powodzeniu (201):

{
  "id": 4711,
  "status": "uploaded",
  "template_id": 12,
  "filename": "lieferschein.pdf",
  "created_at": "2026-10-18T09:15:00+00:00"
}

Skan zużywa jeden kredyt skanu. Wielostronicowe pliki PDF nie są dzielone przez API; plik liczy się jako jeden skan.


Pobieranie skanów

GET /scans/{id} zwraca jeden skan. GET /scans zwraca listę, od najnowszych, po 25 wpisów na stronę. Filtry: status, template_id. Strona: page.

{
  "id": 4711,
  "status": "completed",
  "filename": "lieferschein.pdf",
  "template_id": 12,
  "confidence": 92,
  "extracted_data": {
    "lieferant": "Baustoffe Huber GmbH",
    "datum": "12.10.2026",
    "rows": [
      { "artikel": "Zement CEM II 25 kg", "menge": 40, "einheit": "Sack" },
      { "artikel": "Kantholz 8x10 cm", "menge": 24, "einheit": "Stk" }
    ]
  },
  "reviewed_data": null,
  "validation_errors": null,
  "is_partial": false,
  "error_message": null,
  "created_at": "2026-10-18T09:15:00+00:00",
  "updated_at": "2026-10-18T09:15:21+00:00"
}
Status Znaczenie
uploaded Przesłany, oczekuje na przetworzenie.
processing W trakcie przetwarzania.
completed Gotowy, extracted_data jest wypełnione.
validation_failed Gotowy, ale naruszono co najmniej jedną regułę walidacji. Dane są dostępne, szczegóły w validation_errors.
failed Nie powiodło się, kredyt jest zwracany. error_message podaje przyczynę.

Struktura extracted_data odpowiada polom szablonu: pojedyncze wartości znajdują się pod kluczem pola, wiersze tabeli jako lista pod rows lub pod kluczem pola tabeli. reviewed_data zawiera ręcznie poprawione wartości, jeśli skan był weryfikowany. confidence to wartość od 0 do 100, a is_partial oznacza wynik częściowy.


Lista szablonów

GET /templates zwraca aktywne szablony konta. extraction_mode to scalar, tabular, mixed lub vision.

{
  "data": [
    {
      "id": 12,
      "name": "Lieferschein Huber",
      "extraction_mode": "mixed",
      "usage_count": 58,
      "created_at": "2026-09-20T10:02:11.000000Z"
    }
  ]
}

Sprawdzanie salda

GET /account zwraca pozostałe saldo skanów.

{
  "remaining_scans": 1842,
  "total_scans": 2000,
  "used_scans": 158
}

Webhooki

Webhooki powiadamiają Twoją aplikację, gdy skan zostanie ukończony lub się nie powiedzie. Możesz je utworzyć w aplikacji w sekcji „API i webhooki” lub przez API: GET /webhooks, POST /webhooks (name, url, events), DELETE /webhooks/{id} oraz GET /webhooks/{id}/logs.

Zdarzenie Kiedy
scan.completed Skan został przetworzony (status completed lub validation_failed).
scan.failed Przetwarzanie nie powiodło się.

Przykładowa treść dla scan.completed:

{
  "event": "scan.completed",
  "timestamp": "2026-10-18T09:15:21+00:00",
  "data": {
    "scan_id": 4711,
    "filename": "lieferschein.pdf",
    "template_id": 12,
    "status": "completed",
    "confidence": 92,
    "extracted_data": { "lieferant": "Baustoffe Huber GmbH", "rows": [] },
    "validation_errors": [],
    "is_partial": false
  }
}

Weryfikacja podpisu

Każde żądanie zawiera nagłówki X-DokuScan-Event i X-DokuScan-Signature. Podpis to sha256= oraz HMAC-SHA256 surowej treści żądania z użyciem Twojego sekretu. Zweryfikuj go przed przetworzeniem treści.

// PHP
$raw = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $raw, $secret);
if (!hash_equals($expected, $_SERVER['HTTP_X_DOKUSCAN_SIGNATURE'] ?? '')) {
    http_response_code(401);
    exit;
}

// Node.js (Express, raw body)
const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const valid = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.get('X-DokuScan-Signature') || ''));

Kody błędów

Kod Znaczenie
401 Brak klucza API lub jest nieprawidłowy.
402 Niewystarczające saldo skanów.
403 Konto nie ma dostępu do API (pakiet Business).
404 Nie znaleziono skanu lub szablonu.
409 Ten plik został już przesłany z tym szablonem.
422 Nieprawidłowe parametry. Odpowiedź wskazuje dotknięte pola.
429 Ponad 200 skanów w ostatniej godzinie.
500 Błąd wewnętrzny. Powtórz żądanie później.

Błędy mają postać {"error": "…"}. Przy 404 i 422 odpowiedź zawiera pole message, a przy 422 dodatkowo errors.


Przejdź do centrum pomocy · Zobacz cennik

Stan: październik 2026