Webhooki Zdarzenia w czasie rzeczywistym
Wywołania zwrotne podpisane HMAC dla każdego zdarzenia dotyczącego dokumentu, zadania, obszaru roboczego i zadania. 22 typy zdarzeń, wykładnicze ponawianie, zalecany HTTPS.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": { "pofid": "doc_01HZY8K3…" }
} Zaufanie wiodących firm na całym świecie
22 typy zdarzeń, pogrupowane według encji
Subskrybuj poszczególne zdarzenia lub użyj symbolu wieloznacznego * dla wszystkich.
Dokumenty
14-
dokument.przesłanyNowy dokument przesłany do obszaru roboczego -
dokument.utworzonyAlias dla document.uploaded (kompatybilność) -
dokument.przetworzonyPotok OCR/IDP zakończony pomyślnie -
dokument.edytowanyZaktualizowane metadane, tagi lub zawartość -
dokument.usuniętyDokument przeniesiony do kosza -
dokument.przywróconyDokument przywrócony z kosza -
document.movedDokument przeniesiony między obszarami roboczymi -
dokument.wersja_utworzonaDodano nową wersję do istniejącego dokumentu -
dokument.cykl_życia_zmienionyZmieniono status przechowywania/archiwizacji -
dokument.komentarz_dodanyOpublikowano komentarz na dokumencie -
dokument.notatka_dodanaDołączono notatkę wewnętrzną -
dokument.tag_dodanyPrzypisano tag do dokumentu -
dokument.blokada_prawna_nałożonaAktywowano blokadę prawną (niemodyfikowalna) -
dokument.blokada_prawna_zwolnionaZwolniono blokadę prawną
Zadania
3-
zadanie.zakończoneZadanie asynchroniczne zakończone pomyślnie -
zadanie.nieudaneZadanie asynchroniczne zakończone niepowodzeniem terminalnym -
zadanie.postępAktualizacja postępu podczas długotrwałych zadań
Obszary robocze
2-
workspace.sharedObszar roboczy udostępniony użytkownikowi lub zespołowi -
workspace.unsharedCofnięto dostęp do obszaru roboczego
Zadania
3-
task.createdUtworzono nowe zadanie -
task.completedOznaczono zadanie jako ukończone -
task.overdueZadanie przekroczyło termin wykonania
Subskrybuj ["*"], aby otrzymywać każde zdarzenie swojego konta.
Każda dostawa Followuje ten sam schemat
Przewidywalna treść JSON, pięć podpisanych nagłówków HTTP, znaczniki czasu UTC w formacie ISO-8601.
{
"event_type": "document.processed",
"event_id": "a3b7f9c1d4e8b2a6c9f1d4e7b2a5c8f1",
"timestamp": "2026-04-17T14:23:11Z",
"subscription_id": 42,
"data": {
"pofid": "doc_01HZY8K3M7P2Q9R5T1V6W4X2Y8",
"workspace_id": 17,
"filename": "invoice-2026-04-17.pdf",
"mime_type": "application/pdf",
"size_bytes": 284521,
"processing_result": {
"ocr_done": true,
"classification": "invoice",
"confidence": 0.98
}
}
} Content-Type application/json Zawsze JSON, kodowanie UTF-8 User-Agent PaperOffice-Webhook/1.0 Stały identyfikator dla list dozwolonych zapory X-PaperOffice-Event document.processed Typ dostarczanego zdarzenia X-PaperOffice-Event-ID a3b7f9c1… Unikalny ID 128-bitowy. Użyj do idempotentności. X-PaperOffice-Subscription-ID 42 ID subskrypcji otrzymującej zdarzenie X-PaperOffice-Signature sha256=… HMAC-SHA256 surowej treści, zakodowane szesnastkowo Zweryfikuj każdą dostawę za pomocą HMAC-SHA256
Oblicz HMAC-SHA256 na surowej treści żądania, używając swojego współdzielonego sekretu, a następnie porównaj z X-PaperOffice-Signature, używając porównania o stałym czasie (hash_equals, crypto.timingSafeEqual).
import crypto from 'crypto';
import express from 'express';
const app = express();
const WEBHOOK_SECRET = process.env.PAPEROFFICE_WEBHOOK_SECRET;
app.post('/webhooks/paperoffice', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.header('X-PaperOffice-Signature'); // "sha256=..."
const eventId = req.header('X-PaperOffice-Event-ID');
const eventType = req.header('X-PaperOffice-Event');
const expected = 'sha256=' + crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(req.body)
.digest('hex');
if (!signature || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send('invalid signature');
}
const event = JSON.parse(req.body.toString());
// eventId als Idempotency-Key speichern -> gleiche ID nicht zweimal verarbeiten
console.log(eventType, event.data);
res.status(200).send('ok');
}); Trzy strategie ponawiania, do 10 prób
Wybierz politykę dla każdej subskrypcji. Każda próba jest rejestrowana z kodem statusu, treścią odpowiedzi i czasem.
exponential Wykładnicza (domyślna)
Back-off podwaja się po każdej próbie: 30s, 60s, 120s, 240s, 480s…
linear Liniowa
Stały wzrost: 30s, 60s, 90s, 120s, 150s…
none Brak
Fire-and-forget. Brak ponowień nawet przy błędach 5xx. Przydatne do testowych webhooków.
9 punktów końcowych pod /latest/webhooks/
Pełne CRUD dla subskrypcji, dzienników dostaw, jednorazowych subskrypcji zadań i punkt końcowy testowy — wszystkie z OAuth2 Bearer, wszystkie gotowe do MCP.
/webhooks/subscribe Utwórz nową subskrypcję (nielimitowana na konto) po_webhooks_subscribe /webhooks/list Wyświetl wszystkie subskrypcje konta po_webhooks_list /webhooks/update Zaktualizuj istniejącą subskrypcję po_webhooks_update /webhooks/delete Miękkie usunięcie subskrypcji (dziennik dostaw zachowany) po_webhooks_delete /webhooks/deliveries Pobierz dziennik dostaw z filtrami (event_type, success_only) po_webhooks_deliveries /webhooks/test Wyślij zdarzenie test.ping, aby zweryfikować dostawę po_webhooks_test /webhooks/subscribe-job Jednorazowy webhook dla konkretnego job_id po_webhooks_subscribe_job /webhooks/job-subscriptions Wyświetl subskrypcje dotyczące zadań po_webhooks_job_subscriptions /webhooks/info Dostępne zdarzenia, punkty końcowe, polityki ponawiania, informacje o podpisie po_webhooks_info Utwardzone przez projekt
HMAC-SHA256
Każda ładunek podpisany Twoim sekretem. Porównanie o stałym czasie jest obowiązkowe.
Ochrona przed SSRF
Prywatne/internalne adresy IP, localhost i punkty końcowe metadanych chmury zablokowane podczas subskrypcji i wysyłki.
Bezpieczne przed rebindingiem DNS
IP ponownie walidowane w czasie wysyłki, przypięte przez CURLOPT_RESOLVE.
HTTPS mocno preferowane
http i https akceptowane. HTTPS zalecane dla środowiska produkcyjnego.
Idempotentność Event-ID
Każda dostawa zawiera unikalny X-PaperOffice-Event-ID. Deduplikacja po Twojej stronie.
Pełny ślad audytowy
Wszystkie próby rejestrowane: kod statusu, treść odpowiedzi, czas, komunikat o błędzie.
Nielimitowane subskrypcje, zachowanie dostawy w pełni konfigurowalne
Dostępne we wszystkich planach. Płatność za użycie: 1 kredyt za udaną dostawę (HTTP 2xx). Ponowienia, zdarzenia testowe i nieudane dostawy są darmowe.
Twój pierwszy webhook w 60 sekund
Utwórz punkt końcowy, zasubskrybuj przez API, wywołaj zdarzenie testowe. To wszystko.